Redis set和sorted_set数据类型

一、set类型概念

新的存储需求:存储大量的数据,在查询方面提供更高的效率
需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
set类型:与hash存储结构完全相同,底层数据结构使用哈希表,仅存储field,不存储value(nil),并且field不允许重复

在这里插入图片描述

二、set类型数据的基本操作

添加数据

sadd key member1 [member2]

获取全部数据

smembers key

删除数据

srem key member1 [member2]

获取集合数据总量

scard key

判断集合中是否包含指定数据

sismember key member

在这里插入图片描述

set底层使用的是拉链法哈希表,没有顺序可言(sorted_set底层是跳跃表,有顺序)

在这里插入图片描述

三、set类型数据的扩展操作

1. 业务场景一:资讯推荐

每位用户首次使用进入头条时候会设置3项爱好的内容,但是后期为了增加用户的活跃度,必须让用户对其他信息类别逐渐产生兴趣,增加客户留存度,如何实现?

业务分析

平台分析出各个分类的最新或最热点信息并组织成set集合,随机挑选其中部分信息,配合用户关注信息分类中的热点信息,组织展示信息集合

解决方案

随机获取集合中指定数量的数据(推荐后还从这个集合中继续推荐)

srandmember key [count]

在这里插入图片描述

随机获取集合中的某个数据并将该数据移出集合(推荐过的类别就不推荐了)

spop key

在这里插入图片描述

redis应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热点旅游线路,应用APP推荐,大V推荐等

2. 业务场景二:可能认识的好友推荐

  • 脉脉为了促进用户间的交流,保障业务成单率的提升,需要让每位用户拥有大量的好友,事实上职场新人不具有更多的职场好友,如何快速为用户积累更多的好友?(推荐同一所学校的,推荐朋友的朋友…)

  • 新浪微博为了增加用户热度,提高用户留存性,需要微博用户在关注更多的人,以此获得更多的信息或热门话题,如何提高用户关注他人的总量?(推荐关注同一个博主的…)

  • QQ新用户入网年龄越来越低,这些用户的朋友圈交际圈非常小,往往集中在一所学校甚至一个班级中,如何帮助用户快速积累好友用户带来更多的活跃度?(推荐朋友的朋友…)

  • 微信公众号是微信信息流通的渠道之一,增加用户关注的公众号成为提高用户活跃度的一种方式,如何帮助用户积累更多关注的公众号?(推荐关注相同公众号的…)

求两个集合的交、并、差集

sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]

在这里插入图片描述

求两个集合的交、并、差集并存储到指定集合中

sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]

将指定元素从原始集合移动到目标集合中

smove source destination member  # source里面的member移到destination
  • redis应用于同类信息的关联搜索,二度关联搜索,深度关联搜索
  • 显示共同关注(一度)
  • 显示共同好友(一度)
  • 由用户A出发,获取到好友用户B的好友信息列表(一度)
  • 由用户A出发,获取到好友用户B的购物清单列表(二度)
  • 由用户A出发,获取到好友用户B的游戏充值列表(二度)

3. 业务场景三:多角色权限校验

集团公司共具有12000名员工,内部OA系统中具有700多个角色,3000多个业务操作,23000多种数据,每位员工具有一个或多个角色,如何判断某员工是否能执行某个操作呢?

在这里插入图片描述

解决方案

  • 利用set集合数据不重复的特征,完成数据过滤与快速查询
  • 根据用户id获取用户所有角色
  • 把人对应的角色所有的操作放在一个set集合中

一个用户有两个角色,每个角色有2~3个允许的操作

在这里插入图片描述

此外,我们还可以用sismember判断要执行的操作是否在允许范围内

在这里插入图片描述

redis提供基础数据还是提供校验结果?

需要注意一下,第二种判断方式是在redis中进行的,然而redis只负责读写数据,业务逻辑不应该在redis中执行,第二种方式耦合性高。相较之下,第一种方式只是从redis中获取了所有允许的操作,然后再用业务代码判断当前操作是否允许执行,这样就把业务和数据分开了,耦合性低

4. 业务场景四:统计网站访问量

公司对旗下新的网站做推广,需要统计网站的PV(访问量),UV(独立访客),IP(独立IP)

  • PV:网站被访问次数,可通过刷新页面提高访问量
  • UV:网站被不同用户访问的次数,可通过cookie统计访问量,相同用户切换IP地址,UV不变
  • IP:网站被不同IP地址访问的总次数,可通过IP地址统计访问量,相同IP不同用户访问,IP不变

解决方案

  • 利用set集合的数据去重特征,记录各种访问数据
  • 建立string类型数据,利用incr统计日访问量(PV)
  • 建立set模型,记录不同的cookie数量(UV),以及不同的IP数量(IP)

5. 业务场景五:黑名单

在这里插入图片描述

  • 周期性更新满足规则的用户黑名单,加入set集合
  • 用户行为信息达到后与黑名单进行比对,确认行为去向
  • 黑名单过滤IP地址:应用于开放游客访问权限的信息源
  • 黑名单过滤设备信息:应用于限定访问设备的信息源
  • 黑名单过滤用户:应用于基于访问权限的信息源

四、set数据类型使用的注意事项

  • set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份
  • set虽然与hash的存储结构相同,但是无法启用set中存储value的空间

在这里插入图片描述

五、sorted_set类型概念

  • 新的存储需求:根据排序有利于数据的有效显示,需要提供一种可以排序的存储方式(sorted_set底层基于跳跃表
  • 需要的存储结构:新的存储模型,可以保存可排序的数据
  • sorted_set类型:在set的存储结构基础上添加可排序字段

在这里插入图片描述
在hash数据类型存储空间的基础上,增加了一列score,sorted_set使用score进行排序,同样的field存数据,value依然不存数据

六、sorted_set类型数据的基本操作

添加数据

zadd key score1 member1 [score2 member2]

在这里插入图片描述

获取全部数据

zrange key start stop [WITHSCORES]      # 升序排列,WITHSCORES表示带score输出
zrevrange key start stop [WITHSCORES]   # 降序排列

在这里插入图片描述
在这里插入图片描述

删除数据

zrem key member [member …]

在这里插入图片描述

按score条件获取数据

zrangebyscore key min max [WITHSCORES] [LIMIT]  # limit表示显示几条数据,通常用于分页,左闭右开
zrevrangebyscore key max min [WITHSCORES]

在这里插入图片描述
在这里插入图片描述
按score条件以及索引删除

zremrangebyscore key min max     # 删除key对应的sorted_set中,score介于[min, max]之间的元素
zremrangebyrank key start stop   # 由于sorted_set是排序的,可按照索引删除[start, stop]之间的元素

在这里插入图片描述
在这里插入图片描述
注意:

  • min与max用于限定搜索查询的条件
  • start与stop用于限定查询范围,作用于索引,表示开始和结束索引
  • offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量

获取集合数据总量

zcard key               # 获取sorted_set中元素个数
zcount key min max      # 获取sorted_set中,score介于[min, max]的元素个数

集合交、并操作

# 求交集,默认把相同元素的score求和(也可以求 MIN|MAX),numkeys表示求交集的sorted_set的数量
zinterstore destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
zunionstore destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

在这里插入图片描述
在这里插入图片描述

七、sorted_set类型数据的扩展操作

1. 业务场景一:实时显示资讯热度

  • 票选广东十大杰出青年,各类综艺选秀海选投票
  • 各类资源网站TOP10(电影,歌曲,文档,电商,游戏等)
  • 聊天室活跃度统计
  • 游戏好友亲密度

在这里插入图片描述

获取数据对应的索引(排名)

zrank key member
zrevrank key member

在这里插入图片描述

score 值获取与修改

zscore key member
zincrby key increment member

在这里插入图片描述

2. 业务场景二:限时操作

某网盘有限时体验VIP加速功能,如何用redis实现限时操作?

  • 对于基于时间线限定的任务处理,将处理时间记录为score,利用排序功能区分处理的先后顺序
  • 为提升sorted_set的性能,通常将任务根据特征存储成若干个sorted_set。例如1小时内,1天内,年度等,操作时逐渐提升,将即将操作的若干个任务纳入到1小时内处理队列中

在这里插入图片描述

获取当前系统时间命令:time

八、sorted_set数据类型使用的注意事项

  • score 保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
  • score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时侯要慎重
  • sorted_set底层存储还是基于set结构的,因此元素(field)不能重复,如果重复添加相同的数据,score值将被覆盖,保留最后一次修改的结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bugcoder-9905

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

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

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

打赏作者

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

抵扣说明:

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

余额充值