一碗脊、
Hyperloglog
(基數(shù)統(tǒng)計(jì))
- 基數(shù):數(shù)據(jù)集中不重復(fù)的元素的個(gè)數(shù)
- 應(yīng)用場(chǎng)景:網(wǎng)頁的訪問量(
UV
):同一用戶多次訪問肋层,也只能算作一個(gè)人
優(yōu)點(diǎn):占用內(nèi)存非常少(2^64
不同的元素基數(shù),只需12KB
內(nèi)存)
缺點(diǎn):有0.81%
的誤差(一般可以接受)
傳統(tǒng)實(shí)現(xiàn)方法:存儲(chǔ)用戶的
id
净当,然后每次進(jìn)行比較。當(dāng)用戶變多之后這種方式及其浪費(fèi)空間蕴潦,而我們的目的只是 計(jì)數(shù)像啼,Hyperloglog
就能幫助我們利用最小的空間完成。
- 基本命令(以
pf
開頭):
命令 | 描述 |
---|---|
pfadd key member [member ….] | 添加指定元素到 HyperLogLog 中 |
pfcount key [key…] | 獲得 Hyperloglog 中的成員數(shù)量潭苞,重復(fù)的成員不會(huì)統(tǒng)計(jì) |
pfmerge key destkey sourcekey [sourcekey…] | 將多個(gè)集合忽冻,合并成一個(gè)新的集合 |
- 測(cè)試:
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 的基數(shù)
(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 的基數(shù)
(integer) 14
二、
Bitmap
(位圖)
位存儲(chǔ):通常用來表示數(shù)據(jù)的狀態(tài)此疹,都是用來記錄二進(jìn)制位的操作僧诚,只有
0
和1
兩種狀態(tài)Bitmap
是一串連續(xù)的,從左到右的二進(jìn)制串(0
或1
)蝗碎,每一位所在的位置為偏移(offset
)湖笨,在bitmap
上可執(zhí)行AND
,OR
蹦骑,XOR
慈省,NOT
以及其它位操作應(yīng)用:統(tǒng)計(jì)用戶信息(活躍、不活躍)眠菇、登錄與未登錄边败、打卡等,兩種狀態(tài)的都可以使用
Bitmap
基本命令:
命令 | 描述 |
---|---|
setbit key offset value | 設(shè)置捎废,value 只能存儲(chǔ) 0 或者 1 兩種狀態(tài) |
getbit key offset | 獲取笑窜,通過 key-value 取出對(duì)應(yīng)的狀態(tài)信息 |
bitcount key | 統(tǒng)計(jì),通過 key 來統(tǒng)計(jì)非 0 的數(shù)量 |
- 測(cè)試:
127.0.0.1:6379> setbit sign 0 1 # 設(shè)置 sign 的第 0 位為 1
(integer) 0
127.0.0.1:6379> setbit sign 2 1 # 設(shè)置 sign 的第 2 位為 1登疗,不設(shè)置排截,默認(rèn)為 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 位的數(shù)值
(integer) 1
127.0.0.1:6379> getbit sign 3 # 未設(shè)置默認(rèn)是 0
(integer) 0
127.0.0.1:6379> bitcount sign # 統(tǒng)計(jì) sign 中為 1 的個(gè)數(shù)
(integer) 4