Redis 高级数据结构业务实践

0、前言

本文所有代码可见 => 【gitee code demo】
本文会涉及 hyperloglog 、GEO、bitmap、布隆过滤器的介绍和业务实践

1、HyperLogLog

1.1、功能

基数统计(去重)

1.2、redis api

命令作用案例
PFADD key element [element ...]添加元素到keyPFADD 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到新keyPFMERGE 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 ...]返回geohashGEOHASH 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、案例:手写布隆过滤器防止缓存穿透

过滤器只过滤读操作

过滤器业务流程

在这里插入图片描述

过滤器业务代码

拦截了不存在的用户请求,防止了用户查询相关的缓存穿透

在这里插入图片描述

布隆过滤器实现

在这里插入图片描述

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值