0、前言
本文所有代码可见 => 【gitee code demo】
本文会涉及 hyperloglog 、GEO、bitmap、布隆过滤器的介绍和业务实践
1、HyperLogLog
1.1、功能
基数统计(去重)
1.2、redis api
命令 | 作用 | 案例 |
---|---|---|
PFADD key element [element ...] | 添加元素到key | PFADD websiteVisitors 192.168.1.1 PFADD websiteVisitors 192.168.1.2 如果HyperLogLog的内部估计值发生变化,返回1;否则返回0。 |
PFCOUNT key [key ...] | 统计key中的元素数量估算值 | PFCOUNT websiteVisitors 返回key中的元素数量估算值 |
PFMERGE newkey key1 key2 [keyn ...] | 合并key到新key | PFMERGE totalVisitors morningVisitors eveningVisitors 把两个不同时段的访客IP统计合并为一个总的统计,无返回值 |
1.3、与其他去重数据结构的对比
1.3.1、数据量小 hashset
可以精确地计数,存储数量的同时存储了数据本身,数据量大时会消耗大量内存
1.3.2、数据量中 bitmap
精确计数,相比于 hashset空间占用少,数据量大的情况下空间效率和速度不如 hyperloglog
1.3.3、数据量大 hyperloglog
速度快,占用内存小,但有标准偏差(redis默认 0.81)
1.4、实践:统计用户访问量(IP)
1.4.1、模拟用户访问
1.4.2、获取实时用户访问量
2、GEO
2.1、功能
快速存储、处理和查询地理空间数据
在Redis Geo中,每个地理位置都会被编码成一个Geohash值,并以此作为sorted set中的分值
2.2、redis api
命令 | 作用 | 案例 |
---|---|---|
GEOADD key longitude latitude member [longitude latitude member ...] | 将给定的地理空间位置(经度、纬度和名称)添加到指定的key中 | GEOADD city 116.403963 39.915119 "天安门" 116.403414 39.924091 "故宫" 116.024067 40.362639 "长城" |
GEODIST key member1 member2 [unit] | 计算两个地点之间的距离,默认单位为米 | GEODIST city 天安门 长城 km |
GEOPOS key member [member ...] | 返回经纬度 | GEOPOS city 天安门 故宫 |
GEOHASH key member [member ...] | 返回geohash | GEOHASH city 天安门 故宫 长城 |
GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC/DESC] [STORE key] [STOREDIST key] | 查找给定范围内的地点 WITHDIST: 将位置元素与中心之间的距离也一并返回WITHCOORD: 将位置元素的经度和维度也一并返回 COUNT 限定返回的记录数 | GEORADIUS city 116.418017 39.914402 10 km withdist withcoord count 10 desc |
GEORADIUSBYMEMBER key member radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASCDESC] [STORE key] [STOREDIST key] | 同上 | GEORADIUS city 天安门 10 km withdist withcoord count 10 desc |
2.3、实践:附近酒店推送
通过 java api 操作 Redis GEO
代码 demo
3、bitmap
3.1、功能
由0和1状态表现的二进制bit数组,用于状态统计,如 打卡、签到
3.2、redis api
命令 | 作用 | 案例 |
---|---|---|
SETBIT key offset value | 设置Bitmap中指定位置的位值 | SETBIT mybitmap 5 1 |
GETBIT key offset | 获取Bitmap中指定位置的位值 | GETBIT mybitmap 5 |
BITCOUNT key [start end] | 计算Bitmap中设置为1的位的数量 | BITCOUNT mybitmap |
BITPOS key bit [start] [end] | 找到Bitmap中第一个设置为0或1的位的位置 | BITPOS mybitmap 1 |
BITOP operation destkey key [key ...] | 对一个或多个Bitmap进行AND、OR、XOR和NOT操作 | BITOP AND destkey bitmap1 bitmap2 |
3.3、案例:签到功能
4、布隆过滤器 :bloom filter
4.1、原理
一个大型位数组和几个不同的均匀分布hash函数。用来判断某个数据是否存在
4.2、布隆过滤器误判率&为什么不建议删除key
因为布隆过滤器的每一个 bit 并不是独占的,很有可能多个元素共享了某一位
查询时,key-1的bit位可能被别的key置为1了
删除时,将key对应bit位置为0,可能导致其他映射到该位置的key也被删除
总结:布隆过滤器可以添加元素,但是不能删除元素。因为删掉元素会导致误判率增加
4.3、案例:手写布隆过滤器防止缓存穿透
过滤器只过滤读操作
过滤器业务流程
过滤器业务代码
拦截了不存在的用户请求,防止了用户查询相关的缓存穿透
布隆过滤器实现