Bitmaps
之前的博客有提到过海量数据算法-BitMap介绍和实现
实际上Redis也有这样的数据结构——就是一个一个的字节(实际上也就是String类型),相关指令:
setbit key index 1|0
:将对应的位设置为1/0。getbit key index
:获取对应的位的值。bitop op destKey key1 [key2...]
:bitmap之间的位运算,op可以是:- and:与
- or:或
- not:非
- xor:异或
bitcount key [start end]
:统计bitmap中1的数量
HyperLogLog
作用:统计不重复数据的数量。
虽然Bitmap也可以实现这个功能,但它的空间复杂度极高,而HyperLogLog中的LogLog
代表的是它的空间复杂度,即这种算法的空间复杂度仅有O(log2(log2(Nmax)))
。
它的原理基于基数估计算法(Cardinality Estimation Algorithm):LogLogCounting
(这种算法以后有机会再研究)
相关操作:
pfadd key element [element ...]
:添加数据pfcount key [key ...]
:统计数据,返回不重复数据的个数pfmerge destkey sourcekey [sourcekey ...]
:合并数据
这种算法是一种概率算法,它存在一定的误差。它只需要12K内存,在标准误差0.81%的前提下,能够统计264个数据。
pfadd命令并不是一次性分配12k内存使用,会随着基数的增加内存逐渐增大。
但是只要使用了pfmerge命令合并了空间,得到的合并后的空间就是12k。
GEO
功能:计算两个经纬度坐标点之间的距离。
相关操作:
geoadd key longitude latitude member [longitude latitude member]
:添加坐标点geopos key member [member ...]
:获取坐标点geodist key member1 member2 [unit]
:计算坐标点,默认单位是米georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
:根据坐标求范围内的数据georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
:根据点求范围内的数据geohash key member [member ...]
:获取指定点对应的坐标hash值
示例:
127.0.0.1:6379> geoadd map 1 1 a
(integer) 1
127.0.0.1:6379> geoadd map 2 2 b
(integer) 1
127.0.0.1:6379> geopos map a
1) 1) "0.99999994039535522"
2) "0.99999945914297683"
127.0.0.1:6379> geodist map a b
"157270.0561"
127.0.0.1:6379> geodist map a b km
"157.2701"
127.0.0.1:6379> georadiusbymember map a 180 km withdist
1) 1) "a"
2) "0.0000"
2) 1) "b"
2) "157.2701"
127.0.0.1:6379> georadiusbymember map a 120 km withdist
1) 1) "a"
2) "0.0000"
原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/redis%e9%ab%98%e7%ba%a7%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b%e4%bb%8b%e7%bb%8d/