JavaWeb开发之redis知识总结
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb开发之redis知识总结相关的知识,希望对你有一定的参考价值。
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
Redis是 NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,借助一些高层级的接口使用其可以胜任,如缓存、队列系统的不同角色
Redis的官网: https://redis.io/
目录
1、Redis的特性
- Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
- Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis原生只支持linux系统
Redis官方是不支持windows平台,windows版本是微软自己建立的分支,基于官方的redis源码上进行编译、发布、维护的,所以window平台上的redis版本都略低于官方版本。
2、redis的安装
此处需要拥有linux基础,因为是在linux环境下安装redis,首先去官网下载安装包并解压,解压后使用xftp5软件将redis安装包从window上传到linux,然后使用xshell5远程连接linux,并在命令行输入以下命令,完成安装。
第一步:将redis.tar.gz解压 tar -zxvf redis-3.2.8.tar.gz
第二步:进入redis-3.2.8目录 cd redis-3.2.8
第三步:对redis进行编译 make
第四步:安装到指定的目录 make PREFIX=/usr/local/redis install
注意:如果安装redis是报下面的错误,是因为系统没有安装gcc环境,缺少依赖
解决方案,安装完成后,对redis进行重新编译安装
3、redis客户端测试
redis在linux系统下安装成功后,需要进行客户端测试连接。
第一步:启动redis服务
注意:我们需要将redis编译后的目录 中的redis.conf文件copy到我们自己的redis目录中。
这个redis.conf文件是redis的配置文件。注意:前面是redis-server服务,后面redis.conf配置文件。
第二步:Redis占用的端口是6379,新建一个连接,可以通过redis-cli命令行客户端来测试redis是否启动成功。如下:出现PONG,代表连接redis成功。
4、redis常用数据类型之string
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
1)SET key value设置key持有字符串和GET key得到key的字符串
2)meset和mget一次存取多个值
3)setnx操作:如果key不存在,相当于set,若key存在,不做任何操作
4)msetnx依次给keys传多个值,key必须都不存在,原子性操作,若存在,则不执行
5)append指令,若key存在则直接向原来得后面追加,若key不存在,则相当于set
6)decr原子性递减1,incr是原子性递增1
7)获取原来的key,并为key设置新的值
8)setrange表示从哪个位置开始对key进行修改,返回修改后的长度
9)getrange表示得到key从star开始t到end位置结束的值
5、redis常用数据类型之list
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。
1)lpush和lrange分别是向list中插入和查找元素
2)lpushx在已有的list头部插入元素,若list不存在,则插入失败
3)lpop弹出list中的头部第一个元素
4)llen得到list的长度
5) lrem将链表的count=1个元素value=3移除
5)lset将下标index=3的位置值替换为值value=100
6)获取list中索引index=3的值
7)ltrim保留指定范围内的元素,其余元素删除
8)linsert在指定元素之前或者之后插入新元素
9)rpush表示从元素的尾部进行插入
10)rpop将元素从尾部弹出
11)rpoplpush将第一个key的尾部元素移除并插入到第二个key的头部
6、redis常见数据类型之hash
Redis中的Hashes类型可以看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如用户信息:Username、Password和Age等。每一个Hash可以存储4294967295个键值对。
1)hset和hget操作,分别为为指定的Key设定Field/Value对,和得到key对应Filed 的value
2) hestnx也是为指定的Key设定Field/Value对,仅当field或key不存在的时候可以设置成功
3)hexists判断field是否存在
4)hlen计算hash的key的长度,即获取该Key所包含的Field的数量
5)hdel从指定Key的Hashes Value中删除参数中指定的多个字段
6)hincrby增加指定Key中指定Field关联的Value的值
7)hgetall得到key中所有的field/value
8)hmset和hmget操作可以添加多个field/value和获取多个field对应的value
7、redis常见数据类型之set
在Redis中,我们可以将Set类型看作为没有排序的字符串集合。Set可包含的最大元素数量是4294967295。Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。
1)sadd是添加元素,不含重复元素,smembers为查询set中的所有元素
2) scard获取set集合中元素数量
3) sismeber判断元素是否存在
4)spop随机移除set中的元素
5)srandmember随机获取一个set中的元素
6)srem删除set中的指定元素
7)smove将源头set中的值移入目标set中
8)sdiff是第一个set相比第二个set的差异
9)sdiffstore是将第一个set相比第二个set的差异保存到一个新的set中
10)sinter用于求set1和set2之间的交集
11)sinterstore将set1和set2的交集保存到一个新的set中
12)sunion是求两个set的并集,sunionstore是求并集同时存储到新的set中
8、redis常用数据类型sortedSet
Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。 在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。
1)zadd为key指定多组score/member作为参数
2)zincrby对成员memeber增加分数
3)zcard获取与该Key相关联的Sorted-Sets中包含的成员总数量
4)zcount获取成员分数在min至max之间的
5)zrange返回排名从start到end的成员
6)zrank该命令将返回参数中指定成员的位置值(按分数由低到高的顺序)
7)zrevrank命令将返回参数中指定成员的位置值(按分数由高到低的顺序)
8)zscore命令获得指定成员的分数
9)zrem命令用于删除指定成员
9、redis中key的通用操作
1)keys pattern 用于匹配模式的键列表
2)del命令删除操作
3)exists命令判断当前的key是否存在
4) move 名字用于将key移动到指定编号的库,不移动默认是放到0号库,使用select切换库
5)rename用于完成key的重命名
6)expire命令用于给key设定过期时间
7)persist命令消除过期时间,ttl命令是查看过期时间
8)type命令获取与参数中指定键关联值的类型,该命令将以字符串的格式返回
10、redis事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
- 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行会经历以下三个阶段:
1)开始事务。MULTI 2)命令入队。 3)执行事务。EXEC
事务常用命令
1.MULTI Redis Multi 命令用于标记一个事务块的开始。事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。返回值:总是返回OK
2.EXEC Redis Exec 命令用于执行所有事务块内的命令
返回值: 事务块内所有命令的返回值,按命令执行的先后顺序排列。 当操作被打断时,返回空值 。
3.DISCARD Redis Discard 命令用于取消事务,放弃执行事务块内的所有命令。返回值: 总是返回 OK 。
4.WATCH Redis Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
5.UNWATCH Redis Unwatch 命令用于取消 WATCH 命令对所有 key 的监视
下面演示开启事务和提交事务:
下面是开启事务和取消事务:
以上是关于JavaWeb开发之redis知识总结的主要内容,如果未能解决你的问题,请参考以下文章