Redis数据类型之list和set以及sorted_set排序

Redis数据类型之list和set

1、list类型

  1. 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  2. 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
  3. list类型:保存多个数据,底层使用双向链表存储结构实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v9IVvgVU-1654776792019)(images/image-20220609143224818.png)]

1.1、list基本操作

添加/修改数据

// 左边进入,第一个进入最后一个出
lpush key valuel [value2] ...

// 右边进入,第一个进第一个出
rpush key value1 [value2] ……

获取数据

// 根据开始索引和结束索引查询数据
lrange key start stop

// 根据索引获取值
lindex key index

// 获取数据的长度
llen key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IbdTQRN6-1654776792020)(images/image-20220609144509637.png)]

获取并移除数据

// 左边移除,左边进走出最后一个,右边进走出第一个
lpop key
// 右边移除,左边进走出第一个数据,右边进走出最后一个
rpop key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oI1WbvMm-1654776792021)(images/image-20220609145149674.png)]

1.2、list 类型数据扩展操作

在规定时间内获取并移除数据

// 指定时间内获取集合并从左边移除
blpop key1 [key2] timeout

// 指定时间从那个集合右移除数据
brpop key1 [key2] timeout

// 从指定时间内从(source)集合移动到另一集合(destination)中,后面是有数据等待时间
brpoplpush source destination timeout

1.3、list 类型数据扩展操作

微信朋友圈点赞,要求按照点赞顺序显示点赞好友信息

如果取消点赞,移除对应好友信息

解决方案
// 指定移除的数据
lrem key count value

redis 应用于具有操作先后顺序的数据控制

1.4、list 类型数据操作注意事项

  1. list中保存的数据都是string类型的,数据总容量是有限的,最多2 32 - 1 个元素 (4294967295)。
  2. list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
  3. 获取全部数据操作结束索引设置为-1
  4. list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载

1.5、list 类型应用场景

twitter、新浪微博、腾讯微博中个人用户的关注列表需要按照用户的关注顺序进行展示,粉丝列表需要将最近关注的粉丝列在前面

新闻、资讯类网站如何将最新的新闻或资讯按照发生的时间顺序展示?

企业运营过程中,系统将产生出大量的运营数据,如何保障多台服务器操作日志的统一顺序输出?

解决方案

  1. 依赖list的数据具有顺序的特征对信息进行管理
  2. 使用队列模型解决多路信息汇总合并的问题
  3. 使用栈模型解决最新消息的问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kKeCHYsL-1654776792022)(images/image-20220609154653994.png)]

redis 应用于最新消息展示

2、set类型

  1. 新的存储需求:存储大量的数据,在查询方面提供更高的效率
  2. 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
  3. set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的

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

添加/修改/删除数据

// 添加数据
sadd key member1 [member2]

// 获取全部数据
smembers key

// 删除数据
srem key member1 [member2]

// 获取数据总量
scard key

// 判断集合中是否包含指定数据
sismember key member

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFzgVO1j-1654776792022)(images/image-20220609160100725.png)]

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

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

业务操作

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

业务分析
  1. 系统分析出各个分类的最新或最热点信息条目并组织成set集合
  2. 随机挑选其中部分信息
  3. 配合用户关注信息分类中的热点信息组织成展示的全信息集合
解决方案
// 随机获取集合中指定数量的数据
srandmember key [count]

// 随机获取集合中的某个数据并将该数据移出集合
spop key [count]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T8Z5yLhq-1654776792023)(images/image-20220609161102703.png)]

2.3、set 类型数据的扩展操作2【交并集技术】

业务场景

  1. 脉脉为了促进用户间的交流,保障业务成单率的提升,需要让每位用户拥有大量的好友,事实上职场新人不具有更多的职场好友,如何快速为用户积累更多的好友?
  2. 新浪微博为了增加用户热度,提高用户留存性,需要微博用户在关注更多的人,以此获得更多的信息或热门话题,如何提高用户关注他人的总量?
  3. QQ新用户入网年龄越来越低,这些用户的朋友圈交际圈非常小,往往集中在一所学校甚至一个班级中,如何帮助用户快速积累好友用户带来更多的活跃度?
  4. 微信公众号是微信信息流通的渠道之一,增加用户关注的公众号成为提高用户活跃度的一种方式,如何帮助用户积累更多关注的公众号?
  5. 美团外卖为了提升成单量,必须帮助用户挖掘美食需求,如何推荐给用户最适合自己的美食?
解决方案
// 求两个集合的交集
sinter key1 [key2]
// 求两个集合的并集
sunion key1 [key2]
// 求两个集合的差集,顺序不同结果不同【a-b或b-a】的问题
sdiff key1 [key2]

// 求两个集合的交集并存储到指定的集合中
sinterstore destination key1 [key2]
// 求两个集合的并集并存储到指定的集合中
sunionstore destination key1 [key2]
// 求两个集合的差集并存储到指定的集合中
sdiffstore destination key1 [key2]

// 将指定数据从原始集合中移动到目标集合中
smove source destination member

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nPOpEiFT-1654776792024)(images/image-20220609163753683.png)]

redis 应用于同类信息的关联搜索,二度关联搜索,深度关联搜索

  1. 显示共同关注(一度)
  2. 显示共同好友(一度)
  3. 由用户A出发,获取到好友用户B的好友信息列表(一度)
  4. 由用户A出发,获取到好友用户B的购物清单列表(二度)
  5. 由用户A出发,获取到好友用户B的游戏充值列表(二度)

2.4、set 类型数据操作的注意事项

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

2.5、set类型应用场景

集团公司共具有12000名员工,内部OA系统中具有700多个角色,3000多个业务操作,23000多种数据,每位员工具有一个或多个角色,如何快速进行业务操作的权限校验?

解决方案:
  1. 依赖set集合数据不重复的特征,依赖set集合hash存储结果完成数据过滤与快速查询
  2. 根据用户id获取用户所有角色
  3. 根据用户所有角色获取用户所有操作权限放入到set集合
  4. 根据用户所有角色获取用户所有数据全选放入set集合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Li49Qhiu-1654776792025)(images/image-20220609165536313.png)]

redis应用于同类型不重复数据的合并操作

2.2、set类型应用场景2

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

PV:网站被访问次数,可通过刷新页面提高访问量

UV:网站被不同用户访问的次数,可通过cookie统计访问量,相同用户切换IP地址,UV不变

IP:网站被不同IP地址访问的总次数,可通过IP地址统计访问量,相同IP不同用户访问,IP不变

解决方案
  1. 利用set集合的数据去重特征,记录各种访问数据
  2. 建立string类型数据,利用incr统计日访问量(PV)
  3. 建立set模型,记录不同cookie数量(UV)
  4. 建立set模型,记录不同IP数量(IP)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VDCqDwEZ-1654776792025)(images/image-20220609170552552.png)]

redis应用于同类型数据的快速去重

2.3、set 类型应用场景3

黑名单:在基于技术层面区分出爬虫用户后,需要将此类用户进行有效的屏蔽,这就是

黑名单的典型应用

白名单:对于安全性更高的应用访问,仅仅靠黑名单是不能解决安全问题的,此时需要设定可访问的用户群体,依赖白名单做更为苛刻的访问验证。

解决方案
  1. 基于经营战略设定问题用户发现、鉴别规则
  2. 周期性更新满足规则的用户黑名单,加入set集合
  3. 用户行为信息达到后与黑名单进行比对,确认行为去向
  4. 黑名单过滤IP地址:应用于开放游客访问权限的信息源
  5. 黑名单过滤设备信息:应用于限定访问设备的信息源
  6. 黑名单过滤用户:应用于基于访问权限的信息源

redis 应用于基于黑名单与白名单设定的服务控制

3、sorted_set 类型

  1. 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
  2. 需要的存储结构:新的存储模型,可以保存可排序的数据
  3. sorted_set类型:在set的存储结构基础上添加可排序字段

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

score1是排序的值

添加数据

zadd key score1 member1 [score2 member2]

获取全部数据

zrange key start stop [WITHSCORES]
// 反向排序,由大到小
zrevrange key start stop [WITHSCORES]

删除数据

zrem key member [member ...]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ckb8chYk-1654776792026)(images/image-20220609172820885.png)]

按条件获取数据

// 最小值到最大值
zrangebyscore key min max [WITHSCORES] [LIMIT]

// 最大值到最小值
zrevrangebyscore key max min [WITHSCORES]

// 分页获取数据
zrangebyscore scores min max limit 当前位置 结束位置 withscores

条件删除数据

// 根据索引位置来删除数据
zremrangebyrank key start stop
// 按照最小值和最大值来删除数据
zremrangebyscore key min max

注意:

 min与max用于限定搜索查询的条件

 start与stop用于限定查询范围,作用于索引,表示开始和结束索引

 offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量

获取集合数据总量

// 根据key获取总量
zcard key
// 获取指定的最小值到最大值之间的数据总量
zcount key min max

集合交、并操作(可以进行求和、最大值、最小值操作)

zinterstore destination numkeys key [key ...]

zunionstore destination numkeys key [key ...]

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

业务场景

票选广东十大杰出青年,各类综艺选秀海选投票

各类资源网站TOP10(电影,歌曲,文档,电商,游戏等)

业务分析

为所有参与排名的资源建立排序依据

解决方案

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

默认是由小到大排序

// 正向获取
zrank key member
// 反转获取
zrevrank key member

score值获取与修改

// 获取排名
zscore key member
// 修改排名
zincrby key increment member

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UJYaFYo7-1654776792026)(images/image-20220609193917461.png)]

redis 应用于计数器组合排序功能对应的排名

4、Redis解决方案列表

  1. redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性
  2. redis 控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
  3. redis应用于各种结构型和非结构型高热度数据访问加速
  4. redis 应用于购物车数据存储设计
  5. redis 应用于抢购,限购类、限量发放优惠卷、激活码等业务的数据存储设计
  6. redis 应用于具有操作先后顺序的数据控制
  7. redis 应用于最新消息展示
  8. redis 应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游线路,应用APP推荐,大V推荐等
  9. redis 应用于同类信息的关联搜索,二度关联搜索,深度关联搜索
  10. redis 应用于同类型不重复数据的合并、取交集操作
  11. redis 应用于同类型数据的快速去重
  12. redis 应用于基于黑名单与白名单设定的服务控制
  13. redis 应用于计数器组合排序功能对应的排名
  14. redis 应用于定时任务执行顺序管理或任务过期管理
  15. redis 应用于及时任务/消息队列执行管理
  16. redis 应用于按次结算的服务控制
  17. redis 应用于基于时间顺序的数据操作,而不关注具体时间

猜你喜欢

转载自blog.csdn.net/baidu_39378193/article/details/125210243