<<Redis 核心技术与实战>> 小记随笔 —— 有一亿个keys要统计,应该用哪种集合?
聚合统计
应用场景
统计手机 App 每天的新增用户数和第二天的留存用户数
解决方案
由于Set 类型可以实现并集、交集、差集等能力。所以设计一个 Set 存所有的用户 Id, 并且每天新建一个 Set 存当天访问的用户Id,然后通过并集、交集、差集的计算得出结果。
方案关键点:这些 Set 的计算比较容易耗资源,所以最好是在 Redis 集群的一个从库来做这些计算,不要堵塞主 Redis 的业务。
排序统计
应用场景
最新评论列表包含了所有评论中的最新留言
解决方案
- List 有序集合
可以按照插入顺序来实现。 - Sorted Set 可以根据元素的权重来排序
可以把插入的时间作为权重来实现。
二值状态统计
应用场景
如果记录了 1 亿个用户 10 天的签到情况,你有办法统计出这 10 天连续签到的用户总数吗?
解决方案
使用 Bitmap 来实现存储二值状态。
- 支持按位设置、读取
- 支持统计1的总数
- 支持位与、位或等运算
每一天创建一个 Bitmap,每一位表示一个用户是否签到,1表示签到,0表示未签到,然后把10天对应的 Bitmap 做位与运算,然后统计下计算结果的 Bitmap 签到的总和即可。
基数统计
应用场景
统计网页一天的 UV,这个场景的特点就是每个用户一天中重复登录几次也只会统计一次。
解决方案:
- 使用 Set 或者 Hash 类型可以实现,但是很占用内存。
- 使用 HyperLogLog 类型,但是这个算法是基于概率统计完成的,所以会有一定的误差,标准误差率是0.81%,但是很节省内存,仅12KB
本文作者:Blue Mountain
本文链接:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/17029018.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步