Redis总结2-API的理解与使用(二)


Redis总结2-API的理解与使用(一)


4:列表

  列表类型有两个特点:第一、列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表,例如要获取第5个元素,可以执行lindex user:1:message4(索引从0算起)就可以得到第五个元素。第二、列表中的元素可以是重复的

4.1:命令

下面将按照对列表的5种操作类型对命令进行介绍,命令如表所示。

在这里插入图片描述


1.添加操作
在这里插入图片描述
在这里插入图片描述


2.查找元素
(1)获取指定范围内的元素列表

lrange key start end

注意以下两点:
第一,索引下标从左到右分别是0到N-1,但是从右到左分别是-1到-N。
第二,lrange中的end选项包含了自身,这个和很多编程语言不包含end不太相同

(2)获取列表指定索引下标的元素

lindex key index

例如当前列表倒数第二个元素:
在这里插入图片描述
(3)获取列表长度:llen key


3.删除元素
(1)从列表左侧、右侧弹出元素:lpop key | rpop key
(2)删除指定元素:lrem key count value
lrem命令会从列表中找到等于value的元素进行删除,根据count的不同分为三种情况:

  • count>0,从左到右,删除最多count个元素。
  • count<0,从右到左,删除最多count绝对值个元素。
  • count=0,删除所有。

(3)按照索引范围修剪列表:ltrim key start end
在这里插入图片描述

在这里插入图片描述


4.修改
  修改指定索引下标的元素:lset key index newValue


5.阻塞操作

blpop key [key ...] timeout 
brpop key [key ...] timeout

  blpop和brpop是lpop和rpop的阻塞版本,它们除了弹出方向不同,使用 方法基本相同,所以下面以brpop命令进行说明,brpop命令包含两个参数:

  • key[key…]:多个列表的键。
  • timeout:阻塞时间(单位:秒)。

1)列表为空:如果timeout=3,那么客户端要等到3秒后返回,如果 timeout=0,那么客户端一直阻塞等下去:
在这里插入图片描述
如果此期间添加了数据element1,客户端立即返回:
在这里插入图片描述
2)列表不为空:客户端会立即返回。

注:
第一点,如果是多个键,那么brpop会从左至右遍历键,一旦有一个键能弹出元素,客户端立即返回。
第二点,如果多个客户端对同一个键执行brpop,那么最先执行brpop命令的客户端可以获取到弹出的值。

4.2:内部编码

列表类型的内部编码有两种:

  • ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置 (默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时 (默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使用。
  • inkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用 linkedlist作为列表的内部实现。

提示:
Redis3.2版本提供了quicklist内部编码,简单地说它是以一个ziplist为节点的linkedlist,它结合了ziplist和linkedlist两者的优势,为列表类型提供了一 种更为优秀的内部编码实现。

4.3: 使用场景

1.消息队列
  如图所示,Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用 性。
在这里插入图片描述
2.文章列表
  每个用户有属于自己的文章列表,现需要分页展示文章列表。此时可以考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素。

提示
实际上列表的使用场景很多,在选择时可以参考以下口诀:
lpush+lpop=Stack(栈)
lpush+rpop=Queue(队列)
lpsh+ltrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列)

5:集合

  集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一 样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。

5.1:命令

  下面将按照集合内集合间两个维度对集合的常用命令进行介绍。

5.1.1:集合内操作

1.添加元素:sadd key element [element …]


2.删除元素:srem key element [element …]


3.计算元素个数:scard key
scard的时间复杂度为O(1),它不会遍历集合所有元素,而是直接用 Redis内部的变量


4.判断元素是否在集合中:sismember key element
在返回1,不在则返回0


5.随机从集合返回指定个数元素:srandmember key [count] 不写参数默认为1


6.从集合随机弹出元素:spop key

Redis从3.2版本开始,spop也支持[count]参数。
srandmember和spop都是随机从集合选出元素,两者不同的是spop命令 执行后,元素会从集合中删除,而srandmember不会。


7.获取所有元素:smembers key
返回结果是无序的,

smembers和lrange、hgetall都属于比较重的命令,如果元素过多存在阻 塞Redis的可能性,这时候可以使用sscan来完成,有关sscan命令会在后文介绍

5.1.2:集合间操作

现在有两个集合,它们分别是user:1:follow和user:2:follow
在这里插入图片描述
1.求多个集合的交集:sinter key [key …]


2.求多个集合的并集:suinon key [key …]


3.求多个集合的差集:sdiff key [key …]
在这里插入图片描述


4.将交集、并集、差集的结果保存

sinterstore destination key [key ...] 
suionstore destination key [key ...]
sdiffstore destination key [key ...]

在这里插入图片描述

5.2:内部编码

集合类型的内部编码有两种:

  • intset(整数集合):当集合中的元素都是整数且元素个数小于set-max- intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用。
  • hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使 用hashtable作为集合的内部实现。

5.3:使用场景

  集合类型比较典型的使用场景是标签(tag)。例如一个用户可能对娱乐、体育比较感兴趣,另一个用户可能对历史、新闻比较感兴趣,这些兴趣点就是标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验以及增强用户黏度比较重要。例如一个电子商务的网站会对不同标签的用户做不同类型的推荐,比如对数码产品比较感兴趣的人,在各个页面或者通过邮件的形式给他们推荐最新的数码产品,通常会为网站带来更多的利益。

提示
用户和标签的关系维护应该在一个事务内执行,防止部分命令失败造成的数据不一致,有关如何将两个命令放在一个事务。
前面只是给出了使用Redis集合类型实现标签的基本思路,实际上一个 标签系统远比这个要复杂得多,不过集合类型的应用场景通常为以下几种:
sadd=Tagging(标签)
spop/srandmember=Random item(生成随机数,比如抽奖)
sadd+sinter=Social Graph(社交需求)

6:有序集合

  有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依据。如图2-24所示,该有序集合包含kris、mike、frank、tim、martin、tom, 它们的分数分别是1、91、200、220、250、251,有序集合提供了获取指定分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助我们在实际开发中解决很多问题。
在这里插入图片描述

提示
有序集合中的元素不能重复,但是score可以重复,就和一个班里的同学学号不能重复,但是考试成绩可以相同。

表2-7给出了列表、集合、有序集合三者的异同点。
在这里插入图片描述

6.1:命令

本节依旧按照集合内和集合外两个维度对有序集合的命令进行介绍。

6.1.1:集合内

1.添加成员:zadd key score member [score member …]


在这里插入图片描述
  有关zadd命令有两点需要注意: Redis3.2为zadd命令添加了nx、xx、这两个其它作用跟之前的类似,ch(使用后,返回的是有序集合元素和分数发生变化的个数)、incr(对score做增加,相当于后面介绍的zincrby)。

有序集合相比集合提供了排序字段,但是也产生了代价,zadd的时间 复杂度为O(log(n)),sadd的时间复杂度为O(1)。

2.计算成员个数:zcard key


3.计算某个成员的分数:zscore key member


4.计算成员的排名:从低到高 zrank key member | 从高到低 zrevrank key member


5.删除成员:zrem key member [member …]


6.增加成员的分数:zincrby key increment member


7.返回指定排名范围的成员:zrange key start end [withscores] | zrevrange key start end [withscores]


8.返回指定分数范围的成员:zrangebyscore key min max [withscores] [limit offset count]|zrevrangebyscore key max min [withscores] [limit offset count]
[limit offset count]选项可以限制输出的起始位置和个数,同时min和max还支持开区间(小括号)和闭区间(中括号),-inf和 +inf分别代表无限小和无限大
在这里插入图片描述


9.返回指定分数范围成员个数:zcount key min max


10.删除指定排名内的升序元素:zremrangebyrank key start end
在这里插入图片描述

11:删除指定分数范围的成员:zremrangebyscore key min max
在这里插入图片描述

6.2:集合间操作

  将以下两个有序集合导入到redis中
在这里插入图片描述

 zadd user:ranking:1 1 kris 91 mike 200 frank 220 tim 250 martin 251 tom
 zadd user:ranking:2 8 james 77 mike 625 martin 888 tom

1.交集

zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]

destination:交集计算结果保存到这个键。
·numkeys:需要做交集计算键的个数。
·key[key…]:需要做交集计算的键。
weights weight[weight…]:每个键的权重,在做交集计算时,每个键中 的每个member会将自己分数乘以这个权重,每个键的权重默认是1。
·aggregate sum|min|max:计算成员交集后,分值可以按照sum(和)、 min(最小值)、max(最大值)做汇总,默认值是sum。

  下面操作对user:ranking:1和user:ranking:2做交集,weights和 aggregate使用了默认配置,可以看到目标键user:ranking:1_inter_2对分值 做了sum操作:
在这里插入图片描述
如果想让user:ranking:2的权重变为0.5,并且聚合效果使用max,可以 执行如下操作:
在这里插入图片描述


2.并集

zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]

该命令的所有参数和zinterstore是一致的,只不过是做并集计算.在这里插入图片描述

6.2:内部编码

有序集合类型的内部编码有两种:

  • ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist- entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配 置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。
  • skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作 为内部实现,因为此时ziplist的读写效率会下降。

6.3: 使用场景

  有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用 户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播 放数量、按照获得的赞数。本节使用赞数这个维度,记录每天用户上传视频 的排行榜。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤独的偷学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值