博主主页: 码农派大星.
数据结构专栏 :Java数据结构
数据库专栏: 数据库
JavaEE专栏: JavaEE
软件测试专栏 :软件测试
关注博主带你了解更多知识
目录
[1. List列表](#1. List列表)
[1. LPUSH](#1. LPUSH)
[2. LRANGE](#2. LRANGE)
[3. LPUSHX](#3. LPUSHX)
[4. RPUSH](#4. RPUSH)
[5. RPUSHX](#5. RPUSHX)
[6. LPOP](#6. LPOP)
[7. RPOP](#7. RPOP)
[8. LINDEX](#8. LINDEX)
[9. LINSERT](#9. LINSERT)
[10. LLEN](#10. LLEN)
[11. lrem](#11. lrem)
[12. ltrim](#12. ltrim)
[13. lset](#13. lset)
[14. blpop 和brpop](#14. blpop 和brpop)
[2. list内部编码](#2. list内部编码)
[3. 应用场景](#3. 应用场景)
[4. set集合](#4. set集合)
[1. sadd](#1. sadd)
[2. SMEMBERS](#2. SMEMBERS)
[3. SISMEMBER](#3. SISMEMBER)
[4. spop](#4. spop)
[5. srandmember](#5. srandmember)
[6. SMOVE](#6. SMOVE)
[7. SREM](#7. SREM)
[8. scard](#8. scard)
[9. sinter](#9. sinter)
[10. SINTERSTORE](#10. SINTERSTORE)
[11. SUNION](#11. SUNION)
[12. SUNIONSTORE](#12. SUNIONSTORE)
[13. SDIFF](#13. SDIFF)
[14. SDIFFSTORE](#14. SDIFFSTORE)
[5. set内部编码](#5. set内部编码)
[6. 应用场景](#6. 应用场景)
[7. Zset 有序集合](#7. Zset 有序集合)
[1. ZADD](#1. ZADD)
[2. ZRANGE](#2. ZRANGE)
[3. zcard](#3. zcard)
[4. zcount](#4. zcount)
[5. ZREVRANGE](#5. ZREVRANGE)
[6. ZRANGEBYSCORE](#6. ZRANGEBYSCORE)
[7. ZPOPMAX](#7. ZPOPMAX)
[8. BZPOPMAX](#8. BZPOPMAX)
[9. ZPOPMIN](#9. ZPOPMIN)
[10. BZPOPMIN](#10. BZPOPMIN)
[11. ZRANK](#11. ZRANK)
[12. ZREVRANK](#12. ZREVRANK)
[13. ZSCORE](#13. ZSCORE)
[14. ZREM](#14. ZREM)
[15. ZREMRANGEBYRANK](#15. ZREMRANGEBYRANK)
[16. ZREMRANGEBYSCORE](#16. ZREMRANGEBYSCORE)
[17. ZINCRBY](#17. ZINCRBY)
[18. ZINTERSTORE](#18. ZINTERSTORE)
[19. ZUNIONSTORE](#19. ZUNIONSTORE)
[8. Zset内部编码](#8. Zset内部编码)
[9. 应用场景](#9. 应用场景)
1. List列表
列表类型是⽤来存储多个有序的字符串,在Redis中,可以对列表两端插⼊(push)和弹出(pop),还可以获取指定范围的元素列表、 获取指定索引下标的元素等,列表是⼀种⽐较灵活的数据结构,它可以 充当栈和队列的⻆⾊,在实际开发上有很多应⽤场景
列表类型的特点:
列表中的元素是有序的,这意味着可以通过索引下标获取某个元素或者某个范围的元素列表
区分获取和删除的区别
列表中的元素是允许重复的
命令:
1. LPUSH
将⼀个或者多个元素从左侧放⼊(头插)到list中
LPUSH key element [element ...]
2. LRANGE
获取从start到end区间的所有元素,左闭右闭
LRANGE key start stop
返回值:指定区间的元素
如果超出范围后,redis会尽可能的获取范围中的元素
3. LPUSHX
在key存在时,将⼀个或者多个元素从左侧放⼊(头插)到list中。不存在,直接返回
LPUSHX key element [element ...]
时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数
返回值:插⼊后list的⻓度
4. RPUSH
将⼀个或者多个元素从右侧放⼊(尾插)到list中
RPUSH key element [element ...]
时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数
返回值:插⼊后list的⻓度
5. RPUSHX
在key存在时,将⼀个或者多个元素从右侧放⼊(尾插)到list中
RPUSHX key element [element ...]
时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数
6. LPOP
从list 左侧取出元素(即头删)
LPOP key
返回值:取出的元素或者nil
7. RPOP
从list 右侧取出元素(即尾删)
RPOP key
时间复杂度:O(1)
返回值:取出的元素或者nil
8. LINDEX
获取从左数第index位置的元素
LINDEX key index
返回值:取出的元素或者nil
9. LINSERT
在特定位置插⼊元素
LINSERT key <BEFORE | AFTER> pivot element
返回值:插⼊后的list⻓度
10. LLEN
获取list⻓度
LLEN key
11. lrem
LREM
命令用于从指定的列表中删除与给定值相等的元素
LREM key count value
key:列表的名称
count:要删除的元素数量:
- count > 0 :从列表头部开始删除前
count
个值为value
的元素。 - count < 0 :从列表尾部开始删除前
count
个值为value
的元素(取绝对值) - count = 0 :删除列表中所有值为
value
的元素
value:要删除的值
LREM
命令返回被删除的元素数量
12. ltrim
LTRIM
命令用于对列表进行修剪,即保留列表中指定范围内的元素,并删除其他元素
LTRIM key start stop
key
:列表的键名start
:要保留的起始索引stop
:要保留的结束索引
13. lset
将列表中指定索引(index)的元素值设置为新的值(value)
LSET key index value
key
:列表的键名index
:要设置值的列表的索引,索引从0开始。value
:要设置的新值
阻塞版本命令
14. blpop 和brpop
blpop 和brpop是lpop和rpop的阻塞版本,和对应⾮阻塞版本的作⽤基本⼀致, 但是:
在列表中有元素的情况下,阻塞和⾮阻塞表现是⼀致的。但如果列表中没有元素,⾮阻塞版本会理 解返回nil,但阻塞版本会根据timeout,阻塞⼀段时间,如果指定了超时时间,那么在指定的时间内没有元素被弹出,命令将返回nil,
期间Redis可以执⾏其他命令,但要求执⾏该命令的客⼾端会表现为阻塞状态
命令中如果设置了多个键,那么会从左向右进⾏遍历键,⼀旦有⼀个键对应的列表中可以弹出元 素,命令⽴即返回
如果多个客⼾端同时多⼀个键执⾏pop,则最先执⾏命令的客⼾端会得到弹出的元素
BLPOP
BLPOP key [key ...] timeout
返回值:取出的元素或者nil
BRPOP
BRPOP key [key ...] timeout
返回值:取出的元素或者nil
2. list内部编码
列表类型的内部编码有两种:
ziplist(压缩列表):当列表的元素个数⼩于list-max-ziplist-entries配置(默认512个),同时 列表中每个元素的⻓度都⼩于list-max-ziplist-value配置(默认64字节)时,Redis会选⽤ ziplist来作为列表的内部编码实现来减少内存消耗
linkedlist(链表):当列表类型⽆法满⾜ziplist的条件时,Redis会使⽤linkedlist作为列表的内 部实现
3. 应用场景
消息队列
Redis可以使⽤lpush+brpop命令组合实现经典的阻塞式⽣产者-消费者模型队列, ⽣产者客⼾端使⽤lpush从列表左侧插⼊元素,多个消费者客⼾端使⽤brpop命令阻塞式地从队列中 "争抢"队⾸元素。通过多个客⼾端来保证消费的负载均衡和⾼可⽤性
使用RPUSH
或LPUSH
命令将消息添加到列表中,从而创建一个消息队列。RPUSH
将消息添加到列表的尾部,而LPUSH
将消息添加到列表的头部。生产者使用LPUSH
命令将消息推送到队列中。如果键(队列)不存在,Redis会创建一个新的空队列,然后插入消息.消费者使用RPOP
命令从队列中移除并获取消息,实现先进先出的顺序。如果队列为空,RPOP
命令会返回nil
。由于List不会主动通知消费者有新消息,消费者需要定期执行RPOP
指令来检查新消息,或者使用BLPOP
命令阻塞等待直到有新消息到达
Redis阻塞消息队列模型
Redis分频道阻塞消息队列模型
Redis同样使⽤lpush+brpop命令,但通过不同的键模拟频道的概念,不同的消费 者可以通过brpop不同的键值,实现订阅不同频道的理念
分页展示
需要分⻚展⽰⽂章列表。此时可以考虑使⽤列表,因为列表不但是有序的,同时⽀持按照索引范围获取元素
4. set集合
集合类型也是保存多个字符串类型(String)的元素的,但和列表类型不同的是,集合中元素是无序的,集合中的元素是不能重复的
命令:
1. sadd
将⼀个或者多个元素添加到set中。注意,重复的元素⽆法添加到set中
返回值:本次添加成功的元素个数
2. SMEMBERS
获取⼀个set中的所有元素,注意,元素间的顺序是⽆序的
SMEMBERS key
返回值:所有元素的列表
3. SISMEMBER
判断⼀个元素在不在set中
SISMEMBER key member
返回值:1表⽰元素在set中。0表⽰元素不在set中或者key不存在
4. spop
从set中删除并返回⼀个或者多个元素。注意,由于set内的元素是⽆序的,所以取出哪个元素实际是随机的.
SPOP key [count]
5. srandmember
从set中拿出⼀个或者多个元素。注意,由于set内的元素是⽆序的,所以取出哪个元素实际是随机的.与spop不同的是,srandmember只是拿出元素,不会删除元素.
6. SMOVE
将⼀个元素从源set取出并放⼊⽬标set中
SMOVE source destination member
返回值:1表⽰移动成功,0表⽰失败
7. SREM
将指定的元素从set中删除
SREM key member [member ...]
时间复杂度:O(N),N是要删除的元素个数.
返回值:本次操作删除的元素个数
8. scard
获取⼀个set的元素个数
SCARD key
返回值:set内的元素个数
集合间操作
交集(inter)、并集(union)、差集(diff)
9. sinter
获取给定set的交集中的元素
SINTER key [key ...]
时间复杂度:O(N*M),N是最⼩的集合元素个数.M是最⼤的集合元素个数
10. SINTERSTORE
获取给定set的交集中的元素并保存到⽬标set中
SINTERSTORE destination key [key ...]
时间复杂度:O(N*M),N是最⼩的集合元素个数.M是最⼤的集合元素个数
返回值:交集的元素个数
11. SUNION
获取给定set的并集中的元素
SUNION key [key ...]
时间复杂度:O(N),N给定的所有集合的总的元素个数
返回值:并集的元素
12. SUNIONSTORE
获取给定set的并集中的元素并保存到⽬标set中
SUNIONSTORE destination key [key ...]
时间复杂度:O(N),N给定的所有集合的总的元素个数
返回值:并集的元素个数
13. SDIFF
获取给定set的差集中的元素
SDIFF key [key ...]
时间复杂度:O(N),N给定的所有集合的总的元素个数
返回值:差集的元素
14. SDIFFSTORE
获取给定set的差集中的元素并保存到⽬标set中
SDIFFSTORE destination key [key ...]
时间复杂度:O(N),N给定的所有集合的总的元素个数
返回值:差集的元素个数
5. set内部编码
集合类型的内部编码有两种:
intset(整数集合):当集合中的元素都是整数,并且元素个数不多(小于512个)的情况下
hashtable(哈希表):当集合类型⽆法满⾜intset的条件时,Redis会使⽤hashtable作为集合 的内部实现
6. 应用场景
用户兴趣标签
为每个用户存储他们感兴趣的主题标签,以便根据这些标签为用户推荐相关的内容, 比如短视频app会推送一些你经常看的视频类型的视频
使用set来计算用户之间的共同好友
基于集合求交集
7. Zset 有序集合
有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的 特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关 联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个分数
命令
1. ZADD
添加或者更新指定的元素以及关联的分数到zset中
XX:仅仅⽤于更新已经存在的元素,不会添加新元素
NX:仅⽤于添加新元素,不会更新已经存在的元素
CH:默认情况下,ZADD返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更 新的元素的个数
INCR:此时命令类似ZINCRBY的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和 分数
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member
...]
时间复杂度:O(log(N))
修改:
2. ZRANGE
返回指定区间⾥的元素,分数按照升序。带上WITHSCORES可以把分数也返回
ZRANGE key start stop [WITHSCORES]
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表
3. zcard
获取⼀个zset的基数,即zset中的元素个数
ZCARD key
时间复杂度:O(1)
返回值:zset内的元素个数
4. zcount
返回分数在min和max之间的元素个数,默认情况下,min和max都是包含的,可以通过
ZCOUNT key min max
时间复杂度:O(log(N))
实际上,Zset内部会记录每个元素当前所排行的次序,查询到元素,就直接知道了元素所在的次序(下标),就可以直接把max对应的元素次序和min对应的元素次序,无需遍历
返回值:满⾜条件的元素列表个数
5. ZREVRANGE
返回指定区间⾥的元素,分数按照降序。带上WITHSCORES可以把分数也返回
这个命令可能在6.2.0之后废弃,并且功能合并到ZRANGE中
ZREVRANGE key start stop [WITHSCORES]
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表
6. ZRANGEBYSCORE
返回分数在min和max之间的元素,默认情况下,min和max都是包含的,可以通过(排除
这个命令可能在6.2.0之后废弃,并且功能合并到ZRANGE中
ZRANGEBYSCORE key min max [WITHSCORES]
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表
7. ZPOPMAX
删除并返回分数最⾼的count个元素
ZPOPMAX key [count]
时间复杂度:O(log(N)*M)
返回值:分数和元素列表
8. BZPOPMAX
ZPOPMAX的阻塞版本
BZPOPMAX key [key ...] timeout
这里的有序集合也可以视为是一个优先级队列,有的时候,也需要一个带有"阻塞功能"的优先级队列每个key都是一个有序集合,阻塞也是在集合为空的时候触发阻塞,阻塞到有其他客户端插入元素,timeout表示时间,最多阻塞多久,单位为s
时间复杂度:O(log(N))
返回值:元素列表
9. ZPOPMIN
删除并返回分数最低的count个元素
ZPOPMIN key [count]
时间复杂度:O(log(N)*M)
返回值:分数和元素列表
10. BZPOPMIN
ZPOPMIN的阻塞版本
BZPOPMIN key [key ...] timeout
时间复杂度:O(log(N))
返回值:元素列表
11. ZRANK
返回指定元素的排名,升序
ZRANK key member
时间复杂度:O(log(N))
返回值:排名
12. ZREVRANK
返回指定元素的排名,降序
ZREVRANK key member
时间复杂度:O(log(N))
返回值:排名
13. ZSCORE
返回指定元素的分数
ZSCORE key member
时间复杂度:O(1)
返回值:分数
14. ZREM
删除指定的元素
ZREM key member [member ...]
时间复杂度:O(M*log(N))
返回值:本次操作删除的元素个数
15. ZREMRANGEBYRANK
按照排序,升序删除指定范围的元素,左闭右闭
ZREMRANGEBYRANK key start stop
时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数
16. ZREMRANGEBYSCORE
按照分数删除指定范围的元素,左闭右闭
ZREMRANGEBYSCORE key min max
时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数
17. ZINCRBY
为指定的元素的关联分数添加指定的分数值
ZINCRBY key increment member
时间复杂度:O(log(N))
返回值:增加后元素的分数
集合间操作
18. ZINTERSTORE
用于计算多个有序集合的交集,并将结果存储在新的有序集合中
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
destination
:结果有序集合的名称numkeys
:要计算交集的有序集合的数量key
:参与计算的有序集合的名称WEIGHTS
:指定每个有序集合的权重,默认权重为 1AGGREGATE
:指定交集结果的聚合方式,可以是SUM
(求和)、MIN
(最小值)或MAX
(最大值)。默认是SUM
时间复杂度:O(N*K)+O(M*log(M)) N是输⼊的有序集合中,最⼩的有序集合的元素个数;K是输⼊了 ⼏个有序集合;M是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数
19. ZUNIONSTORE
求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元 素对应的分数按照不同的聚合⽅式和权重得到新的分数
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
时间复杂度:O(N)+O(M*log(M)) N是输⼊的有序集合总的元素个数;M是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数
8. Zset内部编码
有序集合类型的内部编码有两种:
ziplist(压缩列表):当有序集合的元素个数⼩于zset-max-ziplist-entries配置(默认128个), 同时每个元素的值都⼩于zset-max-ziplist-value配置(默认64字节)时,Redis会⽤ziplist来作 为有序集合的内部实现,ziplist可以有效减少内存的使⽤
skiplist(跳表):当ziplist条件不满⾜时,有序集合会使⽤skiplist作为内部实现,因为此时ziplist的操作效率会下降
9. 应用场景
排行榜系统
ZSet非常适合用来实现各种排行榜,例如网站的文章排行、学生成绩排行、直播间礼物排名榜等。通过分数(score)来确定排名,可以轻松地添加新元素、更新排名或获取排名信息