一、Redis 五种类型
1、String(字符串类型)
2、Hash(哈希类型)
3、List(列表类型)
4、Set(集合类型)
5、Zset(有序集合类型)
二、操作
1、String类型是Redis中最简单的数据结构。
它既可以存储文字(例如"hello world"),又可以存储数字(例如整数10086和浮点数3.14),还可以存储二进制数据(例如10010100)。
- 设值:SET Key Value [EX seconds]
将Key键设置成指定的Value值。
如果Key键已经存在,并且保存旧值的话,旧的值会被覆盖,不论旧的类型是否为String都会被忽略掉。如果Key键不存在,那么会在数据库中添加一个Key键,保存的Value值就是刚刚设置的新值。
[EXseconds]选项表示Key键过期的时间,单位为秒。如果不加设置,表示Key键永不过期。
- 批量设值:MSET Key Value[Key Value …]
一次性设置多个Key-Value(键-值对)。
相当于同时调用多次SET命令。操作是原子的。所有的Key键都一次性设置的。
同时运行两个MSET来设置相同的Key键,那么操作的结果也只会是两次MSET中后一次的结果,而不会是混杂的结果。
- 批量添加:MSETNX Key Value [Key Value…]
一次性添加多个Key-Value(键-值对)。
如果任何一个Key键已经存在,那么这个操作都不会执行。
使用MSETNX时,要么全部Key键被添加,要么全部不被添加。这个命令在MSET命令后面增加了一个后缀NX(if Not eXist),表示只有Key键不存在的时候,才会设置Key键的Value值。
- 获取:GET Key
使用GET命令,可以取得单个Key键所绑定的String值。
- 批量获取:MGET Key[Key…]
前缀M,表示多个(Multi)。
使用MGET命令一次性获取多个Value值,和GET命令取得单个比较优点主要在于减少网络传输的次数,提升了性能。
- 获取长度:STRLEN Key
Key键对应的String的长度,Key键对应的不是String,则报错。
Key键不存在,则返回0。
- 为Key键对应的整数Value值增加1:INCR Key
- 为Key键对应的整数Value值减少1:DECR Key
- 为Key键对应的整数Value值增加increment:INCRBY Keyincrement
- 为Key键对应的浮点数Value值增加increment:INCRBYFLOAT Key increment
Redis并没有为浮点数Value值减少decrement的操作DECRBYFLOAT。
要为浮点数Value值减少decrement,只需要把INCRBYFLOAT命令的increment设成负值即可。
设置为1.0 + 10.01 - 5.0
> set root 1.0
> incrbyfloat root 10.01
> incrbyfloat root -5。0
2、List列表
a) 基于双向链表实现的,可以支持正向、反向查找和遍历。List列表是简单的字符串列表,字符串按照添加的顺序排序。
b) 可以添加一个元素到List列表的头部(左边)或者尾部(右边)。一个List列表最多可以包含232-1个元素(最多可超过40亿个元素)。
c) 典型应用场景:网络社区中最新的发帖列表、简单的消息队列、最新新闻的分页列表、博客的评论列表、排队系统等等。
d) 例子:在“双11”秒杀、抢购这样的大型活动中,短时间内有大量的用户请求发向服务器,而后台的程序不可能立刻响应每一个用户的请求,有什么好的办法来解决这个问题呢?我们需要一个排队系统。根据用户的请求时间,将用户的请求放入List队列中,后台程序依次从队列中获取任务,处理并将结果返回到结果队列。换句话说,通过List队列,可以将并行的请求转换成串行的任务队列,之后依次处理。总体来说,List队列的使用场景,是非常多的。
- 右推入(后推入):RPUSH Key Value [Value …]
a) 将一个或多个的Value值依次推入到列表的尾部(右端)。如果Key键不存在,那么RPUSH之前会先自动创建一个空的List列表。如果Key键的Value值不是一个List类型,则会返回一个错误。
b) 如果同时RPUSH多个Value值,则多个Value值会依次从尾部进入List列表。RPUSH命令的返回值为操作完成后List包含的元素量
c) RPUSH时间复杂度为O(N),只推入一个值,那么命令的复杂度为O(1)。
2)左推入(前推入):LPUSH Key Value [Value …]
从List列表的==头部(左侧)==推入的
- 左弹出:LPOP Key
a) PUSH操作是增加元素;而POP操作,则是获取元素并删除。
b) LPOP命令是从List队列的左边(前端),获取并移除一个元素,复杂度O(1)。如果List列表为空,则返回nil。
- 右弹出:RPOP key
从队列的==右边(后端)==获取并移除一个元素
- 获取列表的长度:LLEN Key
- 获取列表指定位置上的元素:LINDEX Key index
7)获取指定索引范围之内的所有元素:LRANGE Key startstop
8)设置指定索引上的元素:LSET Key index Value
> del root
> rpush root a b c d e f
> llen
> lrange root 0 4
> lindex root 3
> lindex root -1
List列表的下标是从0开始的,index为负的时候是从后向前数。-1表示最后一个元素。当下标超出边界时,会返回nil
3、Hash哈希表
a) 是一个String类型的Field字段和Value值之间的映射表,类似于Java中的HashMap。
b) 一个哈希表由多个字段-值对(Field-Value Pair)组成,Value值可以是文字、整数、浮点数或者二进制数据。
c) 在同一个Hash哈希表中,每个Field字段的名称必须是唯一的(Java中HashMap的Key键的规范要求)
- 设置字段-值:HSET Key Field Value
给Field字段设置Value值。如果Field字段之前没有设置值,那么命令返回1;如果Field字段已经有关联值,那么命令用新值覆盖旧值,并返回0。
- 获取字段-值:HGET Key Field
返回Key Field字段所关联的Value值。如果Field字段没有关联Value值,那么返回nil
- 检查字段是否存在:HEXISTS Key Field
查看指定Field字段是否存在:存在则返回1,不存在则返回0。
- 删除给指定的字段:HDEL Key Field [Field …]
删除一个或多个指定Field字段,以及那些Field字段所关联的值。不存在的Field字段将被忽略。命令返回被成功删除的Field-Value对的数量。
- 查看指定的Field字段是否存在:HEXISTS Key Field
- 获取所有的Field字段:HKEYS Key
- 获取所有的Value值:HVALS Key
> del root
> hset config ip 127.0.0.1
> hset config port 8080
> hset config maxalive 5080
> hkeys config
> hvals config
> hexists config timeout
- 哈希表优:方便管理、能够避免键名冲突、并且还能够节约内存
a) 将数据集中存放。通过Hash哈希表,可以将一些相关的信息存储在同一个缓存Key键中,不仅方便了数据管理,还可以尽量避免误操作的发生。
b) 避免键名冲突使用哈希键来存储“键-值对”数据。
c) 减少Key键的内存占用。保存相同数量的“键-值对”信息,使用哈希键比使用字符串键更节约内存。
d) 创建一个Key键都带有很多的附加管理信息(例如这个Key键的类型、最后一次被访问的时间等),缓存的Key键越多,耗费的内存就越多,花在管理数据库Key键上的CPU也会越多。
4、 Set集合
a) 列表:特殊之处在于它是可以自动去掉重复元素的。
b) Set集合类型的使用场景是:当需要存储一个列表,而又不希望有重复的元素(例如ID的集合)时,使用Set是一个很好的选择。并且Set类型拥有一个命令,它可用于判断某个元素是否存在,而List类型并没有这种功能的命令。
c) 通过Set集合类型的命令可以快速地向集合添加元素,或者从集合里面删除元素,也可以对多个Set集合进行集合运算,例如并集、交集、差集。
- 添加元素:SADD Key member1 [member2 ……]
添加一个或多个成员
- 移除元素:SREM Key member1[member2……]
移除一个或多个成员
- 判断某个元素:SISMEMBER Key member
判断member元素是否为Key集合的成员
> del root
> sadd root user1
> sadd root user2 user3 user4 user5
> srem root uer4
> sismember root user1
- 获取集合的成员数:SCARD Key
- 获取集合中的所有成员:SMEMBERS Key
> scard root
> smembers root
5、Zset有序集合
a) Zset和Set使用场景类似,区别是有序集合会根据提供的score参数来进行自动排序。当需要一个不重复的且有序的集合列表,那么就可以选择Zset有序集合类型,常用案例:排行榜。
b) Zset有序集合和Set集合不同的是,有序集合的每个元素,都关联着一个分值(Score),这是一个浮点数格式的关联值。Zset有序集合会按照分值(Score),按从小到大的顺序来排列有序集合中的各个元素。
- 添加成员:ZADD Key Score1 member1 [ScoreNmemberN…]
添加一个或多个成员。如果memberN已经存在,则更新已存在成员的分数。
- 移除元素:ZREM Key member1[memberN……]
移除一个或多个成员
- 取得分数:ZSCORE Key member
取得member成员的分数值
- 取得成员排序:ZRANK Key member
取得member成员的分数值的排名
- 成员加分:ZINCRBY Key Score member
对指定成员的分数加上增量Score
- 区间获取:ZRANGEBYSCORE Key min max[WITHSCORES] [LIMIT]
获取指定分数区间范围内的成员。
WITHSCORES表示带上分数值返回;LIMIT选项,类似与mysql查询的limit选项,有offset、count两个参数值,表示返回的偏移量和成员数量。
在默认情况下,min和max表示的范围,是闭区间范围,而不是开区间范围,即min ≤ score≤ max内的成员将被返回。
可以使用-inf和+inf分别表示有序集合中分数的最小值和最大值。
- 获取成员数:ZCARD Key
8)区间计数:ZCOUNT Key min max
计算指定区间分数的成员数
> del root
> zadd salary 1000 user1
> zadd salary 2000 user2
> zadd salary 3000 user3
> zadd salary 4000 user4
> type salary
> zrank salary user4
> zrank salary user2
> zrangebyscore salary 3000 +inf