redis知识盘点【捌】_redis新特性

本文深入探讨Redis 2.8及后续版本中引入的HyperLogLog、BloomFilter和GEO等高级特性,包括它们的工作原理、优缺点及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个月终于有了一些时间,看了几本书。归。继续更新。这次还是先分享几个redis之前没写的新特性。

 

HyperLogLog

 

2.8版本引入,可用于巨量去重统计,比如统计UV。有点是需要空间很小,只有12KB;缺点是平均会有0.81%的误差。不过当统计量级特别大的时候,HyperLogLog的性价比还是很高的。

基本指令

主要有三个指令:

pfadd:增加成员

pfcount:统计成员数

pfmerge:将多个pf计数值累加一起

 

Bloom Filter(布隆过滤器)

 

4.0版本引入,可以在快速巨量数据里去判断某一成员是否存在。优点是相比其他实现方式节省空间,缺点是有一定的误判概率。

 

基本指令

bf.add  key  sub-key:增加成员

bf.madd  key   sub-key1  sub-key2:批量增加成员

bf.exists  key   sub-key:判断成员是否存在

可以通过bf.reverse指令来自定义布隆过滤器参数:

key:名称

error_rate:容错率,默认0.01。这个值越低需要的空间越大

initial_size:预计放入的元素数量,默认100。当实际数量大于这个值后,误判率会上升

 

实现原理

布隆过滤器的实现原理大概是这样的:

向过滤器增加key的时候,会有多个hash算法对该key计算,基于计算结果按数组长度取模将对应数组位置置为1。当判断一个key是否存在时,则同样用多个hash算法对该key计算,然后判断计算结果对应数组位置是否都为1,若是则认为该key存在。

这里有个问题,有可能其他key计算的结果落在了同样的数组位置上,导致本不存在的key误判为存在。这就是布隆过滤器误差原因所在。也就是说,当布隆过滤器返回这个key存在时,那么这个key可能不存在;但是如果返回这个key不存在,那么这个key一定不存在。

 

GEO

 

在3.2版本引入。可用于实现类似附近的人的功能。

 

基本指令

geoadd  key  longitude   latitude   subkey:增加

geoadd  key  longitude-1   latitude-1   subkey-1  longitude-2   latitude-2   subkey-2:批量增加

geodist  key  subkey1   subkey2  km:计算距离

geopos  key  subkey:获取元素位置

geohash   key    subkey:获取元素hash值

georadiusbymember    key   subkey   {length}   km   count   {num}:获取元素length千米内最近的num个元素,注意元素本身也返回,如果加上withcoord返回元素经纬度,withdist返回距离,withhash返回hash值

georadius   key   longitude   latitude    {length}   km   count   {num}:获取坐标length千米内最近的num个元素,同样可使用上面三个参数

 

实现原理

使用的是业界比较通用的GeoHash算法。就是将二维的经纬度映射到一维的整数,这样大家都相当于在一条线上,只要比较点之间的距离即可。redis是使用zset保存元素,key为元素的健值,value是一个52位的整数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值