(二)redis其余常见结构
A. bitmaps
- 概述:本身非一种数据结构,本质就是字符串。类似数组,仅可设置0或1的value。
- 主要操作
1. 设置值 & 获取
- 基础设置:setbit key offset value
,例如需要统计某网站某天的用户访问情况,则使用setbit unique:users:2022-08-09 0 1
,表示2022年8月9日uid为0的用户访问了该网站;同理,若setbit unique:users:2022-08-09 99 1
则表示uid为99的用户访问了该网站。默认情况下,value都为0。
- 基础获取值:getbit key offset
,若沿用上方案例,offset=88即为查看uid为88的用户在当日有无访问该网站,0表示未访问,1则是曾于今日访问过。
- 范围获取统计:bitcount key [start end]
,不填写offset则默认全域范围内value=1的offset有多少个。
2. bitmap间操作运算
- 交集:bitop and destkey key [key...]
,destkey表示操作后新产生的bitmap的名称,继续网站访问案例,获取8月8和8月9两天都访问的用户数量,则进行两步操作:bitop and unique:users:0808+0809 unique:users:2022-08-09 unique:users:2022-08-08
&bitcount unique:users:0808+0809
获取最终结果
- 并集:bitop or destkey key [key...]
,可以用统计两天内至少访问一次该网站的用户数量。
- 非:bitop not destkey key [key...]
- 异或:bitop xor destkey key [key...]
- 主要功能:redis中的布隆过滤器本质就是基于这个结构的,利用多组hash function,在不同offset下将value从0改成1。
B. HyperLogLog
概述:类似bitmaps其本质也是字符串,利用基数算法实现极小内存空间下完成独立总数的统计,但存在一定误差率,官方统计约为0.81%。
-
主要操作
1. 添加:```pfadd key element [element...]```,添加成功返回1。例如```pfadd 2022-08-09:unique:ids "uuid-1" "uuid-2" "uuid-3"```。 2. 计算:```pfcount key [key...]```,计算上方***2022-08-09:unique:ids***的数量,则使用```pfcount 2022-08-09:unique:ids```,得到结果为3。注意,**若pfadd重复的element,在使用pfcount时会自动去重**,实现独立总数统计的效果。 3. 合并:```pfmerge destkey sourcekey [sourcekey...]```,使用```pfmerge 0808+0809:unique:ids 2022-08-09:unique:ids 2022-08-08:unique:ids```获取两天的统计量,再用```pfcount 0808+0809:unique:ids```获取最终结果。
-
主要功能:一般用于收集ip,email或id等,请参考下方实际案例
若要统计pv,可用redis的incr或incrby实现
但是统计uv的话需要筛选掉pv中重复的uid,可利用mysql的count(distinct user_id)实现,或者redis的set,hash,bitmaps的结构实现;
然而上方的方法效率不好,且存储空间偏大,此时HyperLogLog的优势就出现了,它本身无法取出元素的值,只统计数量