天天看点

Redis高级数据结构GEO/HyperLogLog/BitMapsBitmaps 位图HyperLoglogGEO

Bitmaps 位图

由二进制数组成的数组叫做位图

SETBIT key offset value			给位图指定索引设置值
GETBIT key offset			获取位图指定索引的值
BITCOUNT key [start] [end]     获取位图指定范围(start到end,单位为字节,如果不指定就是获取全部)位值为1的个数
BITPOS key bit [start] [end]   获取位图中第一个值为 bit(0/1) 的二进制位的位置。
           

位图应用

如果一个网站有1亿用户,假如user_id用的是整型,长度为32位,每天有5千万独立用户访问,如何判断是哪5千万用户访问了网站

  • 方式一:用set来保存,使用set来保存数据运行一天需要占用的内存为
32bit * 50000000 = (4 * 50000000) / 1024 /1024 MB,约为200MB
           
  • 方式二:使用bitmap的方式,如果user_id访问网站,则在user_id的索引上设置为1,没有访问网站的user_id,其索引设置为0,此种方式运行一天占用的内存为
1 * 100000000 = 100000000 / 1014 /1024/ 8MB,约为12.5MB
           

由此可见,使用bitmap可以节省大量的内存资源

Bitmaps 最大可以存储2^32 位

HyperLoglog

基于基数算法,极小空间完成独立数量统计.基数就是一个数据集中不重复的元素.

PFADD key element [element …] //将任意数量的元素添加到指定的 HyperLogLog 里面。
PFCOUNT key [key …] // 返回基数
    // 作用于单个键时, 返回储存在给定键的 HyperLogLog 的近似基数
    // 作用于多个键时, 返回所有给定 HyperLogLog 的并集的近似基数
PFMERGE destkey sourcekey [sourcekey …] //将多个 HyperLogLog 合并为一个 HyperLogLog , 合并后的 HyperLogLog 的基数接近于所有输入 HyperLogLog 的可见集合(observed set)的并集.合并得出的 HyperLogLog 会被储存在 destkey 中.
           

使用Hyperloglog注意事项:

  • Hyperloglog基数统计有0.81%错误率
  • Hyperloglog无法得到单条记录

GEO

GEO即地址信息定位可以用来存储经纬度,计算两地距离,范围计算等

GEOADD key longitude latitude member [longitude latitude member …] // 将给定的空间元素(经度、纬度、名字)添加到指定的键里面。
GEOPOS key member [member …] // 获取指定名字的经纬度
GEODIST key member1 member2 [unit] //返回两个给定位置之间的距离。
    // unit 指定单位.m 表示单位为米(默认),km 表示单位为千米,mi 表示单位为英里,ft 表示单位为英尺
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]  //以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
    // radius 半径
    // WITHDIST 位置元素与中心之间的距离,距离的单位和用户给定的范围单位保持一致。
    // WITHCOORD 将位置元素的经度和维度也一并返回。
    // WITHHASH 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
    // COUNT count 获取前N个匹配元素
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count] //中心点是由给定的位置元素决定
GEOHASH key member [member …] //返回一个或多个位置元素的 11位Geohash 表示。(经纬度转字符串,不常用)
           

使用GEO注意事项:

  • GEO本质存储在Zset中,可以使用Zset的命令进行删除
  • GEO有效的经度从-180度到180度。
  • GEO有效的纬度从-85.05112878度到85.05112878度。
  • GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。

继续阅读