Redis-聚合操作

  1. 一、聚合
    1. 1.0 模拟数据
    2. 1.1 并集-UNIONSTORE
    3. 1.2 差集-DIFFSTORE
    4. 1.3 交集-INTERSTORE
  2. 二、排序
    1. 2.1 List
    2. 2.2 SortedSet
  3. 三、二值状态
  4. 四、基数统计

一、聚合

1.0 模拟数据

添加

sadd key1 1
sadd key1 2
sadd key1 3

sadd key2 1
sadd key2 "a"
sadd key2 3

列表
sscan key1 0
1
2
3

sscan key2 0
1
a
3

1.1 并集-UNIONSTORE

所有给定集合的并集存储在新建key集合中

SUNIONSTORE key-union key1 key2

sscan key-union 0
1
a
3
2

1.2 差集-DIFFSTORE

返回给定所有集合的差集并存储在新建key集合中

SDIFFSTORE key-diff key1 key2

sscan key-diff 0
2

1.3 交集-INTERSTORE

返回给定所有集合的交集并存储在新建key集合中

SINTERSTORE key-inter key1 key2

sscan key-inter 0
1
3

二、排序

保序:List、SortedSet。

scan data 0
a
b
c
d
e

2.1 List

根据插入顺序,建立消息顺序。
但是在涉及到分页时,增或删就会有特殊问题。

LRANGE data 0 2
a
b
c

LRANGE data 3 5
d
e
f

新增一条G
lpush data G

此时的分页就彻底乱掉了
LRANGE data 0 2
G
a
b

LRANGE data 3 5
c
d
e

2.2 SortedSet

根据权重来建立消息顺序。

zadd data 2 a 3 b 4 c 5 d 6 e 7 f

新增一条G
zadd data 1 G

此时使用ZRANGEBYSCORE命令根据权重分值来查询
ZRANGEBYSCORE data 2 4
a
b
c

ZRANGEBYSCORE data 5 7
d
e
f

此时我们只需要根据分值分页排序,就可以拿到在新增后依旧是原先列表的数据集合了。

三、二值状态

集合元素的取值就只有 0 和 1 两种。使用Bitmap为我们的数据结构。
Bitmap 本身是用 String 类型作为底层数据结构实现的一种统计二值状态的数据类型。

事例:
设置2022年5月1日已签到:

setbit data:202205 0 1

getbit data:202205 0

统计2022年5月签到数:
bitcount data:202205

另外,bitmap提供了丰富的二进制操作符操作。BITOP命令配合ANDORNOTXOR

BITOP 二进制操作 resbitmap bitmap1 bitmap2 ...

四、基数统计

基数统计就是指统计一个集合中不重复的元素个数。

一个用户一天内的多次访问只能算作一次,就是统计网页的 UV。网页 UV 的统计有个独特的地方,就是需要去重。sethash默认支持去重。

但是两者在数据量达到千万以上后,非常消耗内存。

HyperLogLog 是一种用于统计基数的数据集合类型,它的最大优势就在于,当集合元素数量非常多时,它计算基数所需的空间总是固定的,而且还很小。

每个 HyperLogLog 只需要花费 12 KB 内存,就可以计算接近 2^64 个元素的基数。

pfadd data u1 u2 u3 u4

然后来获取统计结果

pfcount data
5

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