【存储中间件】Redis核心技术与实战(一):Redis入门与应用(常用数据结构:集合set、有序集合ZSET)
文章目录
- Redis入门与应用
- Redis常用数据结构
- 集合(set)
- 集合内操作命令
- sadd 添加元素
- srem 删除元素
- scard 计算元素个数
- sismember 判断元素是否在集合中
- srandmember 随机从集合返回指定个数元素
- spop 从集合随机弹出元素
- smembers 获取所有元素(不会弹出元素)
- 集合间操作命令
- sinter 求多个集合的交集
- suinon 求多个集合的并集
- sdiff 求多个集合的差集
- 将交集、并集、差集的结果保存
- 使用场景
- 有序集合(ZSET)
- 集合内操作命令
- zadd添加成员
- zcard 计算成员个数
- zscore 计算某个成员的分数
- zrank计算成员的排名
- zrem 删除成员
- zincrby 增加成员的分数
- zrange和zrevrange返回指定排名范围的成员
- zrangebyscore返回指定分数范围的成员
- zcount 返回指定分数范围成员个数
- zremrangebyrank 按升序删除指定排名内的元素
- zremrangebyscore 删除指定分数范围的成员
- 集合间操作命令
- zinterstore 交集
- zunionstore 并集
- 使用场景
个人主页:道友老李
欢迎加入社区:道友老李的学习社区
Redis入门与应用
Redis常用数据结构
集合(set)
集合( set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。
一个集合最多可以存储2的32次方-1个元素。Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多实际问题。
集合内操作命令
sadd 添加元素
允许添加多个,返回结果为添加成功的元素个数
srem 删除元素
允许删除多个,返回结果为成功删除元素个数
scard 计算元素个数
sismember 判断元素是否在集合中
如果给定元素element在集合内返回1,反之返回0
srandmember 随机从集合返回指定个数元素
指定个数如果不写默认为1
spop 从集合随机弹出元素
同样可以指定个数,如果不写默认为1,注意,既然是弹出,spop命令执行后,元素会从集合中删除,而srandmember不会。
smembers 获取所有元素(不会弹出元素)
返回结果是无序的
集合间操作命令
现在有两个集合,它们分别是set1和set2
sinter 求多个集合的交集
suinon 求多个集合的并集
sdiff 求多个集合的差集
将交集、并集、差集的结果保存
sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]
集合间的运算在元素较多的情况下会比较耗时,所以 Redis提供了上面三个命令(原命令+store)将集合间交集、并集、差集的结果保存在destination key中,例如:
使用场景
集合类型比较典型的使用场景是标签(tag)。例如一个用户可能对娱乐、体育比较感兴趣,另一个用户可能对历史、新闻比较感兴趣,这些兴趣点就是标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验以及增强用户黏度比较重要。
例如一个电子商务的网站会对不同标签的用户做不同类型的推荐,比如对数码产品比较感兴趣的人,在各个页面或者通过邮件的形式给他们推荐最新的数码产品,通常会为网站带来更多的利益。
除此之外,集合还可以通过生成随机数进行比如抽奖活动,以及社交图谱等等。
有序集合(ZSET)
有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数( score)作为排序的依据。
有序集合中的元素不能重复,但是score可以重复,就和一个班里的同学学号不能重复,但是考试成绩可以相同。
有序集合提供了获取指定分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助我们在实际开发中解决很多问题。
集合内操作命令
zadd添加成员
返回结果代表成功添加成员的个数
要注意:
zadd命令还有四个选项nx、xx、ch、incr 四个选项
nx: member必须不存在,才可以设置成功,用于添加。
xx: member必须存在,才可以设置成功,用于更新。
ch: 返回此次操作后,有序集合元素和分数发生变化的个数
incr: 对score做增加,相当于后面介绍的zincrby
zcard 计算成员个数
zscore 计算某个成员的分数
如果成员不存在则返回nil
zrank计算成员的排名
zrank是从分数从低到高返回排名
zrevrank反之
很明显,排名从0开始计算。
zrem 删除成员
允许一次删除多个成员。
返回结果为成功删除的个数。
zincrby 增加成员的分数
zrange和zrevrange返回指定排名范围的成员
有序集合是按照分值排名的,zrange是从低到高返回,zrevrange反之。如果加上
withscores选项,同时会返回成员的分数
zrangebyscore返回指定分数范围的成员
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores][limit offset count]
其中zrangebyscore按照分数从低到高返回,zrevrangebyscore反之。例如下面操作从低到高返回200到221分的成员,withscores选项会同时返回每个成员的分数。
同时min和max还支持开区间(小括号)和闭区间(中括号),-inf和+inf分别代表无限小和无限大:
zcount 返回指定分数范围成员个数
zcount key min max
zremrangebyrank 按升序删除指定排名内的元素
zremrangebyrank key start end
zremrangebyscore 删除指定分数范围的成员
zremrangebyscore key min max
集合间操作命令
zinterstore 交集
zinterstore
这个命令参数较多,下面分别进行说明
destination:交集计算结果保存到这个键。
numkeys:需要做交集计算键的个数。
key [key …]:需要做交集计算的键。
weights weight
[weight …]:每个键的权重,在做交集计算时,每个键中的每个member 会将自己分数乘以这个权重,每个键的权重默认是1。
aggregate sum/
min |max:计算成员交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做汇总,默认值是sum。
不太好理解,我们用一个例子来说明。(算平均分)
zunionstore 并集
该命令的所有参数和zinterstore是一致的,只不过是做并集计算,大家可以自行实验。
使用场景
有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播放数量、按照获得的赞数。