先给出指导意见:
  • 多个集合操作(聚合操作)----用Set
  • 集合数据排序(排序操作) ---- 分页排序建议使用ZSet
  • 集合数据只有0、1两种状态(二值型数据)----------- 0/1状态数据建议使用Bitmap
  • 集合中不重复元素个数(基数统计)----如果数据量达到亿级的话建议使用HyperLogLog

1. 多个集合操作(聚合操作)

Set—求多个集合数据的并、差、交集(求并、差、交集计算量大,可以选一个从库单独进行,或者将多个集合返回客户端,到客户端进行计算)

2. 集合数据排序 ---- 分页排序建议使用ZSet

List、ZSet都可以实现显示最新数据,但是List只能按照加入的时间顺序排列,ZSet可以给数据赋权值,按照权值的大小进行排列

ZSet的底层数据结构如下图:

请添加图片描述

但是如果做分页查询时List会出错,用户可能无法查到他想获取的数据,如下图用户想查询最早的记录,如果点击相应尾页的时候插入了大量新的数据,数据页就会移动,用户在该页查到的就会是新插入的数据,而不是最老的数据。

ZSet分页是按照每条记录的权值分的,当前时刻第二页如果为W=10 —> W=20,那么就算加入了新数据,也会先暂存第一页,第一页会超出分页上限,但是第二页仍然是从W=10到W=20,这样可以保证用户想要在当前时刻查询最早的记录时可以查到。(两者对比图如下)

请添加图片描述
所以对于实时快速更新的需要排序显示的数据记录(特别是需要分页时)最好使用ZSet。

3. 集合数据只有0、1两种状态(二值型数据)----------- 0/1状态数据建议使用Bitmap

使用Bitmap(本质是一个bit数组)记录,比如用(K,V)记录用户id:001本周每天的登录情况(1表示当天登录,0表示当天未登录),可以如下表示

SETBIT  id:001  :  0 1 0 1 0 1 0 ;   // id:001  [0,1,0,1,0,1,0]

其中每个0和1只占用一个bit,比使用boolean、char等数据结构更省空间。

4. 集合中不重复元素个数(基数统计)----如果数据量达到亿级的话建议使用HyperLogLog

Set中保存的都是不重复的数据,(K,V)中的V保存的是完整的数据,但是如果只需要统计不重复的V的个数,不需要知道V中具体的数据信息,可以使用HyperLogLog,因为他可以节省大量空间(想象用一个整数型变量取代一大串字符串就好),但是HyperLogLog会有0.81%左右的统计误差

最后引用一张图总结上述四种Redis中的集合操作分别对应的数据结构

在这里插入图片描述
ps:最后评论区了解到一般大数据分析有专门的应用处理,所以一般不在Redis上进行处理。

补充:各数据类型的最大存储长度

1. String:512M
2. Set,ZSet,List,Hash:2^32 -1 个元素

参考文章:

https://time.geekbang.org/column/article/280680

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐