【Redis】redis中的HyperLogLog和GEO

Redis HyperLogLog

Redis 在 2.8.9 版本添加了 HyperLogLog 结构。它是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

示例

以下示例演示了 HyperLogLog 的工作过程:

127.0.0.1:6379> PFADD hll redis
(integer) 1
127.0.0.1:6379> PFADD hll zookeeper
(integer) 1
127.0.0.1:6379> PFADD hll kafka
(integer) 1
127.0.0.1:6379> PFCOUNT hll
(integer) 3

HyperLogLog常用命令

下表列出了 redis HyperLogLog 的基本命令,注意目前关于HyperLogLog的命令就如下几个:

命令 说明
PFADD key element [element …] 添加指定元素到 HyperLogLog 中。
PFCOUNT key [key …] 返回给定 HyperLogLog 的基数估算值。
PFMERGE destkey sourcekey [sourcekey …] 将多个 HyperLogLog 合并为一个 HyperLogLog

Redis GEO

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。它基于zset实现,可以用于存储经纬度、计算两地距离、范围计算等。该功能在目前来说很实用。

Redis GEO 操作方法如下表:

命令 说明
geoadd 添加地理位置的坐标。
geopos 获取地理位置的坐标。
geodist 计算两个位置之间的距离。
georadius 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
georadiusbymember 根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
geohash 返回一个或多个位置对象的 geohash 值。

GEO操作方法示例

geoadd

geoadd 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。

geoadd 语法格式如下:
GEOADD key longitude latitude member [longitude latitude member …]
longitude:经度 latitude:纬度
以下示例中 key 为 location,Palermo 和 Catania 为位置名称 :

127.0.0.1:6379> GEOADD location 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
127.0.0.1:6379> GEODIST location Palermo Catania
"166274.1516"
127.0.0.1:6379> GEORADIUS location 15 37 100 km
1) "Catania"
127.0.0.1:6379> GEORADIUS location 15 37 200 km
1) "Palermo"
2) "Catania"

geopos

geopos 用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
geopos 语法格式如下:
GEOPOS key member [member …]

127.0.0.1:6379> GEOADD location 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
127.0.0.1:6379> GEOPOS location Palermo Catania beijing
1) 1) "13.36138933897018433"
   2) "38.11555639549629859"
2) 1) "15.08726745843887329"
   2) "37.50266842333162032"
3) (nil)
redis>

geodist

geodist 用于返回两个给定位置之间的距离。
geodist 语法格式如下:
GEODIST key member1 member2 [m|km|ft|mi]
其中 member1 member2 为两个地理位置。最后一个距离单位参数说明:

  • m :米,默认单位。
  • km :千米。
  • mi :英里。
  • ft :英尺。

计算 Palermo 与 Catania 之间的距离:

127.0.0.1:6379> GEOADD location 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 0
127.0.0.1:6379> GEODIST location Palermo Catania
"166274.1516"
127.0.0.1:6379> GEODIST location Palermo Catania km
"166.2742"
127.0.0.1:6379> GEODIST location Palermo Catania mi
"103.3182"
127.0.0.1:6379> GEODIST location Palermo Beijing
(nil)
127.0.0.1:6379> 

georadius、georadiusbymember

georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

georadiusbymember 和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember 的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。

georadius 与 georadiusbymember 语法格式如下:
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
参数说明:

  • m :米,默认单位。
  • km :千米。
  • mi :英里。
  • ft :英尺。
  • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
  • WITHCOORD: 将位置元素的经度和纬度也一并返回。
  • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
  • COUNT 限定返回的记录数。
  • ASC: 查找结果根据距离从近到远排序。
  • DESC: 查找结果根据从远到近排序。

georadius 示例:

127.0.0.1:6379>  GEOADD location 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
127.0.0.1:6379> GEORADIUS location 15 38 200 km WITHDIST
1) 1) "Palermo"
   2) "144.0794"
2) 1) "Catania"
   2) "55.8462"
127.0.0.1:6379> GEORADIUS location 15 38 200 km WITHCOORD
1) 1) "Palermo"
   2) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) 1) "15.08726745843887329"
      2) "37.50266842333162032"
127.0.0.1:6379> GEORADIUS location 15 38 200 km WITHCOORD WITHDIST
1) 1) "Palermo"
   2) "144.0794"
   3) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) "55.8462"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"
127.0.0.1:6379> GEORADIUS location 15 38 200 km WITHCoord withdist count 1
1) 1) "Catania"
   2) "55.8462"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"

127.0.0.1:6379> GEORADIUS location 15 38 200 km WITHCoord withdist desc
1) 1) "Palermo"
   2) "144.0794"
   3) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) "55.8462"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"

georadiusbymember 实例:

127.0.0.1:6379> GEOADD location 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania" 116.28 39.55 "beijing" 116.41 39.10 "tianjing"
(integer) 4
##以地点北京为中心点
127.0.0.1:6379> GEORADIUSBYMEMBER location beijing 100 km 
1) "tianjing"
2) "beijing"

geohash

Redis GEO 使用 geohash 来保存地理位置的坐标。geohash 用于获取一个或多个位置元素的 geohash 值。

geohash 语法格式如下:
GEOHASH key member [member …]
实例

127.0.0.1:6379> GEOHASH location beijing tianjing
1) "wx48ypbe2q0"
2) "wwfy2vznj80"
127.0.0.1:6379>

更多关于redis的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出

你可能感兴趣的:(redis,redis,linq,数据库)