zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

<<Redis 核心技术与实战>> 小记随笔 —— 有一亿个keys要统计,应该用哪种集合?

Redis统计集合 实战 gt lt 应该 核心技术
2023-09-14 09:11:25 时间

聚合统计

应用场景

统计手机 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