文章目录
- 聚合统计
- 排序统计
- List
- Sorted Set
- 二值状态统计
- 基数统计
- 数据类型比较
聚合统计
统计多个集合元素的聚合结果,比如交集、差集、并集运算。
具体场景:统计手机APP每天的新增用户数和第二天的留存用户数
记录登录过APP的用户ID可以用set类型
累计用户set

每日用户set

- 每日新增用户:每日用户set和累计用户set的差集
- 留存用户:计算两个日期的差集
Set的差集、并集、交集计算复杂度较高,在数据量较大的情况下,如果直接执行会导致阻塞,可以通过从库进行聚合计算,或者将数据读取到客户端进行聚合统计。
排序统计
要求集合中元素按照顺序保存,Redis中List 和 Sorted Set是有序集合
- List是按照元素进入List的顺序进行排序的
- Sorted Set是按照元素的权重来排序的
具体场景:电商网站上的最新评论列表
List
假设当前的评论 List 是{A, B, C, D, E, F}
LRANGE product1 0 2
1) "A"
2) "B"
3) "C"产生了一个新评论 G
LRANGE product1 3 5
1) "C"
2) "D"
3) "E"C又出现了,原因如下:
List 是通过元素在 List 中的位置来排序的,当有一个新元素插入时,原先的元素在 List 中的位置都后移了一位,比如说原来在第 1 位的元素现在 排在了第 2 位。
对比新元素插入前后,List 相同位置上的元素就会发生变化,用 LRANGE 读取时,就会读到旧元素。
Sorted Set
根据元素的实际权重来排序和获取数据的。
按评论时间的先后给每条评论设置一个权重值,然后再把评论保存到 Sorted Set 中。
Sorted Set 的 ZRANGEBYSCORE 命令就可以按权重排序后返回元素。
新增评论5并不会影响之前的4-1的评论的score重新排序,所以,不会出现重复元素

二值状态统计
二值状态就是指集合元素的取值就只有 0 和 1 两种
Bitmap 本身是用 String 类型作为底层数据结构实现的一种统计二值状态的数据类型。
Bitmap 提供了 GETBIT/SETBIT/BITCOUNT命令
Bitmap通过 BITOP 按位 与、或、异或的操作
具体场景:签到场景,统计1亿个用户连续10天签到情况

每天的日期作为一个key,每个key对应一个1亿位Bitmap,每个bit对应一个用户当天的签到情况
然后用BITCOUNT 统计最后resmap中1的个数,就是10天的签到用户总数
每天使用1个1亿位的Bitmap,大约占12MB内存,10天的Bitmap占120MB,内存压力不算特别大。
基数统计
统计一个集合中不重复的元素的个数
HyperlogLog是一种用于统计基数的的数据集合类型,优势在于当集合元素非常多的时候,它需要的空间总是固定的。
每个 HyperLogLog 只需要花费 12 KB 内存,就可以计算接近 2^64 个元素 的基数
具体场景:网页UV的统计
Hash和Set方案都会造成使用内存过大
//添加
PFADD page1:uv user1 user2 user3 user4 user5//计算总量值
PFCOUNT page1:uvHyperLogLog 的统计规则是基于概率完成的,所以它给出 的统计结果是有一定误差的,标准误算率是 0.81%
数据类型比较

















