Redis集合统计模式
Redis集合统计模式
1. 聚合统计
1.1 概念
- 统计多个集合元素的聚合结果
- 交集统计 — 统计多个集合的共有元素
- 差集统计 — 统计其中一个集合独有的元素
- 并集统计 — 统计多个集合的所有元素
- 聚合统计可以使用Set类型来做
- 但是Set的差集,并集,交集的计算复杂度比较高,在数据量比较大的情况下,直接执行可能会导致Redis实例阻塞。
- 可以从主从集群当中选择一个从库,使其专门负责聚合计算,或者将数据读取到客户端,在客户端完成聚合统计
1.2 案例分析
- 统计一个手机App的每天的新增用户数和第二天的留存用户数
- 用一个集合记录所有登陆过App的用户Id
- key — user:id
- value — set类型 记录用户id
- 另外一个集合记录每天用户set
- key — user:id:20210808
- value — set类型 记录用户id
// 差值统计
SUNIONSTORE user:id user:id user:id:20210808
// 计算新用户
SDIFFSTORE user:new user:id:20210808 user:id
// 计算留存用户
SINTERSTOPRE user:id:rem user:id:20210808 user:id:20210809
2. 排序统计
2.1 概念
- 需要能对输出进行排序,Redis常用的4个集合类型当中 (List, Hash, Set, Sorted Set), List和Sorted Set属于有序集合
- List按照元素进入List的顺序排序,而Sorted Set可以根据元素的权重来排序
2.2 案例
- 电商网站上提供最新评论列表的场景
- List在这个场景里面的问题
- 因为根据位置排序,当有新的评价加进来,那么可能会有一些评价会在不同页面重复出现
- Sorted Set不存在这个问题,因为它是根据元素的实际权重来排序和获取数据的
- 我们可以按照评论时间的先后给每条评论设置一个权重值,然后将评论保存到Sorted Set当中
- ZRANGEBYSCORE命令就可以按照权重排序以后返回元素
3. 二值状态统计
3.1 概念
- 指集合元素的取值只有0和1两种
- 计算海量二值状态数据的时候,bitmap可以有效减少所需的内存空间
3.2 案例
- 签到统计
- 每个用户一天的签到用一个bit位就能表示
- 因此并不需要非常复杂的数据类型,使用bitmap就可以了
- Redis提供了Bitmap类型
- GETBIT
- SETBIT
- 将某一位设置为1
- BITCOUNT
- 用来统计所有1的个数
// 记录用户8 3 签到了
SETBIT uid:sign:3000:202008 2 1
// 检查是否8 3 签到了
GETBIT uid:sign:3000:202008 2
// 统计该用户8月份的签到次数
BITCOUNT uid:sign:3000:202008
- 如何统计一亿个用户连续10天的签到情况
- 将每天日期作为key,每个key对应一个1亿位的bitmap 每一个bit对应一个用户当天的签到情况
- 对10个bitmap做与操作
- 然后用BITCOUNT统计下最终生成的Bitmap当中1的个数
4. 基数统计
4.1 概念
- 基数统计指统计一个集合中不重复的元素的个数
4.2 案例
- 统计一个网页的UV
- 需要去重,一个用户一天内的多次访问只能算一次
- 可以使用SET或者HASH类型来进行记录,但是会消耗很大的内存空间
- 可以使用HyperLogLog
- 用于统计基数的数据集合类型
- 优势在于当集合元素数量非常多的时候,计算基数所需的空间总是固定的,而且还很小
- Redis中每个HyperLogLog只需要使用12KB内存,就可以计算接近2^64个元素的基数
- HyperLogLog的统计规则是基于概率完成的,因此其给出的统计结果是有一定误差的,标准误算率为0.81% ; 如果应用场景是必须非常精确,那就还需要使用Set或者Hash类型
PFADD page1:uv user1 user2 user3 user4
PFCOUNT page1:uv
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 stone2paul@gmail.com
文章标题:Redis集合统计模式
文章字数:1k
本文作者:Leilei Chen
发布时间:2021-08-09, 07:32:13
最后更新:2021-08-09, 07:32:56
原始链接:https://www.llchen60.com/Redis%E9%9B%86%E5%90%88%E7%BB%9F%E8%AE%A1%E6%A8%A1%E5%BC%8F/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。