Redis中的Bitmaps、HyperLogLog、GEO

一、Bitmaps:

位图:用一个bit位的状态来表示某个数据的是否已经存在。

基本操作:

//	offset:偏移量,从0开始  value:只能为0/1
setbit  key  offset  value

getbit  key  offset

//	获取当前位图数组中,指定下标范围内,值为1的个数
bitcount key [start]  [end]

位运算操作:

//	对多个位图做位运算。op取值:and,or,not,xor
//	将将位运算的结果放在指定的destkey中
bitop  op destkey  key [key...]

注意:
位图不一定就会适应更少的地内存,以统计某个网站的每天用户访问量为例:

  1. 当用户数较大时,bitmaps相较于set来说能够省去大量的内存空间。但反之如果访问量就几千的话,反而可能浪费更多的空间,因为会存在大量的0标记位。
  2. 使用setbit key offset value时,如果useID的设计较大时(比如分布式ID),不要直接作为offset的值,而是先处理再放入。这里要按照id的设计具体处理。可以采用每个id都减去最小的id作为最后的offset。

二、HyperLogLog:

HyperLogLog可以使用更少的内存来统计不同值的个数。但存在0.81%的失误率,即他统计的数据不是准确的。

基本操作:

//	向HyperLogLog里添加元素,若已存在相同元素则不再进行添加。
pfadd key element[element...]

//	统计目前不同元素的个数
pfcount key

合并操作:

//	合并2个HyperLogLog的元素放在destkey中,返回合并后的不同值的总个数
pfmerge destket sourcekey[sourcekey...]
说明:
bitmaps与HeperLogLog实质是使用String类型实现的。

三、GEO:

Redis中的Bitmaps、HyperLogLog、GEO_第1张图片
GEO也是不重复的,即一个key中,一个member只能出现一次。当需要修改某个member时,也是使用geoadd命令。

geopos key member 用来获取某个member的经纬度。

geodist key member1 member2 [unit]用来统计两个地点之间的距离:
unit表示返回结果单位:
Redis中的Bitmaps、HyperLogLog、GEO_第2张图片
获取指定范围内的地理信息位置集合:

//	求以指定经纬度为中心,半径范围内的地理信息
georadius  key  经度  维度  半径+单位

//	求以指定成员为中心,半径范围内的地理信息
georadiusbymember  key  member 半径+单位

对于上面2个命令。同时还提供了很多可选参数:
Redis中的Bitmaps、HyperLogLog、GEO_第3张图片

注意:
GEO底层存储数据采用的是zset,它把二维的经纬度转换为以为geohash放入zset中。
经纬度与geohash是可以相互转换的。
表示geohash的长度越长,表示的位置越精确。
两个geohash越相似,他们之间的距离越近,Redis采用的是字符串前缀算法。

你可能感兴趣的:(Redis)