Redis 笔记(十)-三种特殊类型 Hyperloglog(基
2021-08-10 本文已影响0人
yjtuuige
一、
Hyperloglog
(基数统计)
- 基数:数据集中不重复的元素的个数
- 应用场景:网页的访问量(
UV
):同一用户多次访问,也只能算作一个人
优点:占用内存非常少(2^64
不同的元素基数,只需12KB
内存)
缺点:有0.81%
的误差(一般可以接受)
传统实现方法:存储用户的
id
,然后每次进行比较。当用户变多之后这种方式及其浪费空间,而我们的目的只是 计数,Hyperloglog
就能帮助我们利用最小的空间完成。
- 基本命令(以
pf
开头):
命令 | 描述 |
---|---|
pfadd key member [member ….] | 添加指定元素到 HyperLogLog 中 |
pfcount key [key…] | 获得 Hyperloglog 中的成员数量,重复的成员不会统计 |
pfmerge key destkey sourcekey [sourcekey…] | 将多个集合,合并成一个新的集合 |
- 测试:
127.0.0.1:6379> pfadd mykey a b c d e f g h i j # 添加元素
(integer) 1
127.0.0.1:6379> pfadd mykey2 z m k l b j a i c
(integer) 1
127.0.0.1:6379> type mykey # hyperloglog 底层使用 String
string
127.0.0.1:6379> pfcount mykey # 估算 mykey 的基数
(integer) 10
127.0.0.1:6379> pfcount mykey2
(integer) 9
127.0.0.1:6379> pfmerge mykey3 mykey mykey2 # 合并 mykey 和 mykey2 成为 mykey3(并集)
OK
127.0.0.1:6379> pfcount mykey3 估算 mykey3 的基数
(integer) 14
二、
Bitmap
(位图)
-
位存储:通常用来表示数据的状态,都是用来记录二进制位的操作,只有
0
和1
两种状态 -
Bitmap
是一串连续的,从左到右的二进制串(0
或1
),每一位所在的位置为偏移(offset
),在bitmap
上可执行AND
,OR
,XOR
,NOT
以及其它位操作 -
应用:统计用户信息(活跃、不活跃)、登录与未登录、打卡等,两种状态的都可以使用
Bitmap
-
基本命令:
命令 | 描述 |
---|---|
setbit key offset value | 设置,value 只能存储 0 或者 1 两种状态 |
getbit key offset | 获取,通过 key-value 取出对应的状态信息 |
bitcount key | 统计,通过 key 来统计非 0 的数量 |
- 测试:
127.0.0.1:6379> setbit sign 0 1 # 设置 sign 的第 0 位为 1
(integer) 0
127.0.0.1:6379> setbit sign 2 1 # 设置 sign 的第 2 位为 1,不设置,默认为 0
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> getbit sign 0 # 获取第 0 位的数值
(integer) 1
127.0.0.1:6379> getbit sign 3 # 未设置默认是 0
(integer) 0
127.0.0.1:6379> bitcount sign # 统计 sign 中为 1 的个数
(integer) 4