redis数据类型(二)

博主主页: 码农派大星.

数据结构专栏 :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. 应用场景)

用户兴趣标签

使用set来计算用户之间的共同好友

[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命令阻塞式地从队列中 "争抢"队⾸元素。通过多个客⼾端来保证消费的负载均衡和⾼可⽤性

使用RPUSHLPUSH命令将消息添加到列表中,从而创建一个消息队列。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:指定每个有序集合的权重,默认权重为 1
  • AGGREGATE:指定交集结果的聚合方式,可以是 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)来确定排名,可以轻松地添加新元素、更新排名或获取排名信息

相关推荐
然然阿然然3 小时前
2025.1.16——六、BabySQL 双写绕过|联合注入
数据库·学习·mysql·web安全·网络安全
L~river3 小时前
SQL刷题快速入门(三)
数据库·sql·mysql·笔试·刷题
T.O.P113 小时前
SQL语法基础知识总结
数据库·sql·mysql
BillKu3 小时前
数据库存储上下标符号,sqlserver 2008r2,dm8
数据库·sqlserver·达梦数据库·dm8
Amir_zy3 小时前
Python脚本:不同Oracle库的表进行读写
数据库·python·oracle
m0_748239833 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
JUN12JUN123 小时前
简单的sql注入 buuctf
服务器·数据库·oracle
CSBLOG3 小时前
Day30上 - ChromaDB 向量数据库
数据库·人工智能·深度学习·oracle
GottdesKrieges3 小时前
GaussDB日常维护操作
数据库·sql·gaussdb
庄小焱6 小时前
JPA——JPA 开发步骤实战
数据库·数据持久化·jpa