文章目录

  • 聚合统计
  • 排序统计
  • List
  • Sorted Set
  • 二值状态统计
  • 基数统计
  • 数据类型比较


聚合统计

统计多个集合元素的聚合结果,比如交集、差集、并集运算。

具体场景:统计手机APP每天的新增用户数和第二天的留存用户数

记录登录过APP的用户ID可以用set类型

累计用户set

redis集合有没有限制 redis 集合 并集_List


每日用户set

redis集合有没有限制 redis 集合 并集_数据类型_02

  • 每日新增用户:每日用户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重新排序,所以,不会出现重复元素

redis集合有没有限制 redis 集合 并集_List_03

二值状态统计

二值状态就是指集合元素的取值就只有 0 和 1 两种

Bitmap 本身是用 String 类型作为底层数据结构实现的一种统计二值状态的数据类型。

Bitmap 提供了 GETBIT/SETBIT/BITCOUNT命令

Bitmap通过 BITOP 按位 与、或、异或的操作

具体场景:签到场景,统计1亿个用户连续10天签到情况

redis集合有没有限制 redis 集合 并集_数据类型_04


每天的日期作为一个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:uv

HyperLogLog 的统计规则是基于概率完成的,所以它给出 的统计结果是有一定误差的,标准误算率是 0.81%

数据类型比较

redis集合有没有限制 redis 集合 并集_redis集合有没有限制_05