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)来确定排名,可以轻松地添加新元素、更新排名或获取排名信息

相关推荐
夜泉_ly1 小时前
MySQL -安装与初识
数据库·mysql
qq_529835352 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New5 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6755 小时前
数据库基础1
数据库
我爱松子鱼5 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo5 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser6 小时前
【SQL】多表查询案例
数据库·sql
Galeoto6 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
希忘auto7 小时前
详解Redis在Centos上的安装
redis·centos
人间打气筒(Ada)7 小时前
MySQL主从架构
服务器·数据库·mysql