天天看点

redis知识盘点【捌】_redis新特性HyperLogLogBloom Filter(布隆过滤器)GEO

这个月终于有了一些时间,看了几本书。归。继续更新。这次还是先分享几个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。当实际数量大于这个值后,误判率会上升

实现原理

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

redis知识盘点【捌】_redis新特性HyperLogLogBloom Filter(布隆过滤器)GEO

向过滤器增加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位的整数。