这个月终于有了一些时间,看了几本书。归。继续更新。这次还是先分享几个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位的整数。