searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Redis中统计相关的数据结构及方法

2023-11-09 08:09:41
8
0

## 聚合统计
- 所谓的聚合统计,就是指统计多个集合元素的聚合结果,包括:统计多个集合的共有元素(交集统计);把两个集合相比,统计其中一个集合独有的元素(差集统计);统计多个集合的所有元素(并集统计)。
- 使用Set实现:`SUNIONSTORE(并集)、SDIFFSTORE(差集)、SINTERSTORE(交集)`
- Set 的差集、并集和交集的计算复杂度较高,在数据量较大的情况下,如果直接执行这些计算,会导致 Redis 实例阻塞。所以,分享一个小建议:`可以从主从集群中选择一个从库,让它专门负责聚合计算,或者是把数据读取到客户端,在客户端来完成聚合统计,这样就可以规避阻塞主库实例和其他从库实例的风险了`。

## 排序统计
- 要求集合类型能对元素保序,List 和 Sorted Set 都属于有序集合。
- List 是按照元素进入 List 的顺序进行排序的,而 Sorted Set 可以根据元素的权重来排序。
- 在面对需要展示最新列表、排行榜等场景时,如果数据更新频繁或者需要分页显示,优先考虑使用 Sorted Set。

## 二值状态统计
- 这里的二值状态就是指集合元素的取值就只有 0 和 1 两种。比如签到打卡,只有签或没签。
- 可以选择使用扩展类型Bitmap,Bitmap 本身是用 String 类型作为底层数据结构实现的一种统计二值状态的数据类型。可以把 Bitmap 看作是一个 bit 数组。
- `GETBIT/SETBIT 操作`,使用一个偏移值 offset 对 bit 数组的某一个 bit 位进行读和写,offset从0开始。
- `BITCOUNT 操作`,用来统计这个 bit 数组中所有“1”的个数。
- `BITOP操作`,支持位运算AND、OR、NOT、XOR。
```redis
设用户8月3日签到
> SETBIT uid:sign:3000:202008 2 1 

查用户8月3日是否签到
> GETBIT uid:sign:3000:202008 2 

统计该用户在 8 月份的签到次数
> BITCOUNT uid:sign:3000:202008
```

## 基数统计
- 基数统计就是指统计一个集合中不重复的元素个数。比如统计网页的 UV。
- 精确统计建议使用Set或Hash,但是数据量较大时内存也会消耗很多。
- 集合元素量达到亿级别而且`不需要精确统计时`,可以使用HyperLogLog。HyperLogLog不直接存储数据集合本身,通过一定的概率统计方法预估基数值。
```redis
记录page1的uv
> PFADD page1:uv user1 user2 user3 user4 user5

查看page1的uv
> PFCOUNT page1:uv
```

0条评论
0 / 1000
l****n
5文章数
0粉丝数
l****n
5 文章 | 0 粉丝
l****n
5文章数
0粉丝数
l****n
5 文章 | 0 粉丝
原创

Redis中统计相关的数据结构及方法

2023-11-09 08:09:41
8
0

## 聚合统计
- 所谓的聚合统计,就是指统计多个集合元素的聚合结果,包括:统计多个集合的共有元素(交集统计);把两个集合相比,统计其中一个集合独有的元素(差集统计);统计多个集合的所有元素(并集统计)。
- 使用Set实现:`SUNIONSTORE(并集)、SDIFFSTORE(差集)、SINTERSTORE(交集)`
- Set 的差集、并集和交集的计算复杂度较高,在数据量较大的情况下,如果直接执行这些计算,会导致 Redis 实例阻塞。所以,分享一个小建议:`可以从主从集群中选择一个从库,让它专门负责聚合计算,或者是把数据读取到客户端,在客户端来完成聚合统计,这样就可以规避阻塞主库实例和其他从库实例的风险了`。

## 排序统计
- 要求集合类型能对元素保序,List 和 Sorted Set 都属于有序集合。
- List 是按照元素进入 List 的顺序进行排序的,而 Sorted Set 可以根据元素的权重来排序。
- 在面对需要展示最新列表、排行榜等场景时,如果数据更新频繁或者需要分页显示,优先考虑使用 Sorted Set。

## 二值状态统计
- 这里的二值状态就是指集合元素的取值就只有 0 和 1 两种。比如签到打卡,只有签或没签。
- 可以选择使用扩展类型Bitmap,Bitmap 本身是用 String 类型作为底层数据结构实现的一种统计二值状态的数据类型。可以把 Bitmap 看作是一个 bit 数组。
- `GETBIT/SETBIT 操作`,使用一个偏移值 offset 对 bit 数组的某一个 bit 位进行读和写,offset从0开始。
- `BITCOUNT 操作`,用来统计这个 bit 数组中所有“1”的个数。
- `BITOP操作`,支持位运算AND、OR、NOT、XOR。
```redis
设用户8月3日签到
> SETBIT uid:sign:3000:202008 2 1 

查用户8月3日是否签到
> GETBIT uid:sign:3000:202008 2 

统计该用户在 8 月份的签到次数
> BITCOUNT uid:sign:3000:202008
```

## 基数统计
- 基数统计就是指统计一个集合中不重复的元素个数。比如统计网页的 UV。
- 精确统计建议使用Set或Hash,但是数据量较大时内存也会消耗很多。
- 集合元素量达到亿级别而且`不需要精确统计时`,可以使用HyperLogLog。HyperLogLog不直接存储数据集合本身,通过一定的概率统计方法预估基数值。
```redis
记录page1的uv
> PFADD page1:uv user1 user2 user3 user4 user5

查看page1的uv
> PFCOUNT page1:uv
```

文章来自个人专栏
My Redis
5 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0