Redis 之特殊类型Geospatial 、HyperLogLog和Bitmap

105 阅读4分钟

Geospatial

使用

标题
geoadd将给定的空间元素(纬度、经度、名字)添加到指定的键里面。 这些数据会以有序集合的形式被储存在键里面, 从而使得像 GEORADIUS 和 GEORADIUSBYMEMBER 这样的命令可以在之后通过位置查询取得这些元素。GEOADD 命令以标准的 x,y 格式接受参数, 所以用户必须先输入经度, 然后再输入纬度。
geodist返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。指定单位的参数 unit 必须是以下单位的其中一个:m 表示单位为米。km 表示单位为千米。mi 表示单位为英里。ft 表示单位为英尺。如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。
georadius以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
georadiusbymember这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点。
geohash返回一个或多个位置元素的 Geohash 表示。
127.0.0.1:6379> geoadd USA 13.361389 38.115556 "New York" 15.087269 37.502669 "Texas"  # 添加位置集合
(integer) 2
127.0.0.1:6379> geopos USA Texas  # 查询某位置的经纬度
1) 1) "15.08726745843887329"
   2) "37.50266842333162032"
127.0.0.1:6379> geodist USA "New York" Texas km  # 查询两个城市间的距离
"166.2742"
127.0.0.1:6379> georadius USA 12 37 300 km      # 查询某点 指定半径范围内的地方
1) "New York"
2) "Texas"
127.0.0.1:6379> georadius USA 12 37 200 km
1) "New York"
127.0.0.1:6379> georadius USA 12 37 300 km withdist  # 某半径范围内到某点的距离和地方
1) 1) "New York"
   2) "172.6365"
2) 1) "Texas"
   2) "278.9760"
127.0.0.1:6379> georadius USA 12 37 300 km withcoord    # 某半径范围内到某点地方的经纬度
1) 1) "New York"
   2) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Texas"
   2) 1) "15.08726745843887329"
      2) "37.50266842333162032"
127.0.0.1:6379> georadius USA 12 37 300 km withcoord withdist count 1  # 某半径范围内 一个地方
1) 1) "New York"   # 虽然有两个,但只显示一个
   2) "172.6365"    # 到某点的距离
   3) 1) "13.36138933897018433"    # 经纬度
      2) "38.11555639549629859"
127.0.0.1:6379> georadius USA 12 37 300 km withcoord withdist count 2
1) 1) "New York"    
   2) "172.6365"               # withdist
   3) 1) "13.36138933897018433"   #  withcoord 
      2) "38.11555639549629859"
2) 1) "Texas"
   2) "278.9760"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"
127.0.0.1:6379> georadiusbymember USA Texas 180 km  # 某地点指定范围内有什么地点,包括本身
1) "New York"
2) "Texas"
127.0.0.1:6379> geohash USA "New York"  
1) "sqc8b49rny0"

HyperLogLog

  • 用较少的内存统计某样东西的数量,而不需要知道它的具体内容

用法

标题
pfadd将任意数量的元素添加到指定的 HyperLogLog 里面。
pfcount当 PFCOUNT key [key …] 命令作用于单个键时, 返回储存在给定键的 HyperLogLog 的近似基数, 如果键不存在, 那么返回 0 。当 PFCOUNT key [key …] 命令作用于多个键时, 返回所有给定 HyperLogLog 的并集的近似基数, 这个近似基数是通过将所有给定 HyperLogLog 合并至一个临时 HyperLogLog 来计算得出的。
pfmerge将多个 HyperLogLog 合并(merge)为一个 HyperLogLog , 合并后的 HyperLogLog 的基数接近于所有输入 HyperLogLog 的可见集合(observed set)的并集。
127.0.0.1:6379> pfadd mykey a b c d e f   # 创建添加
(integer) 1
127.0.0.1:6379> pfcount mykey     # 统计
(integer) 6
127.0.0.1:6379> pfcount mykey4 e f g h i j k k  # 统计不同元素的个数
(integer) 7
127.0.0.1:6379> pfadd mykey2 e f g h i j k
(integer) 1
127.0.0.1:6379> pfcount mykey2   
(integer) 7
127.0.0.1:6379> pfmerge mykey3 mykey mykey2   # 将后面两个不同的元素并到mykey3
OK
127.0.0.1:6379> pfcount mykey3  # 有abcdefghijk 11个
(integer) 11

Bitmap

  • 只有两种状态是使用非常棒

详解

offset(偏移)

  • offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内)。

image.png

使用

标题
setbit对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。位的设置或清除取决于 value 参数,可以是 0 也可以是 1 。当 key 不存在时,自动生成一个新的字符串值。
bitcount计算给定字符串中,被设置为 1 的比特位的数量。一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,start和end的单位是字节,8位一个字节。可以让计数只在特定的位上进行。
127.0.0.1:6379> setbit bitmaps 0 1  
(integer) 0
127.0.0.1:6379> setbit bitmaps 1 1
(integer) 0
127.0.0.1:6379> setbit bitmaps 2 1
(integer) 0
127.0.0.1:6379> setbit bitmaps 3 1
(integer) 0
127.0.0.1:6379> setbit bitmaps 4 1
(integer) 0
127.0.0.1:6379> setbit bitmaps 5 0
(integer) 0
127.0.0.1:6379> setbit bitmaps 6 0
(integer) 0
127.0.0.1:6379> setbit bitmaps 7 0
(integer) 0
127.0.0.1:6379> bitcount bitmaps
(integer) 5
127.0.0.1:6379> bitcount bitmaps 0 1  # 只使用了8 bit(位),没有超过一个字节,所以是5 
(integer) 5