Redis高级数据类型介绍

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%的前提下,能够统计2​64个数据。

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/

发表评论

电子邮件地址不会被公开。