redis--三种特殊的数据类型

Geospatial地理位置

朋友的定位,附近的人,打车距离计算!等等

RedisGeoRedis3.2版本就推出了,这个功能可以推算地理位置的信息,两地之间的距离,附近的小伙伴等等!

可以查询一些测试数据:http://www.jsons.cn/lngcode/

 

 

 

添加一些城市的地里位置坐标:
规则:两级无法直接添加,一般会下载城市数据,直接通过Java程序进行一次性导入!
127.0.0.1:6379[1]> GEOADD china:city 116.405285 39.904989 beijing
(integer) 1
127.0.0.1:6379[1]> GEOADD china:city 121.472644 31.231706 shanghai 125.14904 42.927 xian
(integer) 2
127.0.0.1:6379[1]> GEOADD china:city 120.153576 30.287459 hangzhou 114.13116 22.54836 shenzheng
(integer) 2
127.0.0.1:6379[1]> GEOADD china:city 106.504962 29.533155 chongqi
(integer) 1
127.0.0.1:6379[1]> 
获取城市的坐标:
127.0.0.1:6379[1]> geopos china:city beijing chongqi
1) 1) "116.40528291463851929"
   2) "39.9049884229125027"
2) 1) "106.50495976209640503"
   2) "29.53315530684997015"
127.0.0.1:6379[1]> 

  

GEODIST

返回两个给定位置之间的距离。

如果两个位置之间的其中一个不存在, 那么命令返回空值。

指定单位的参数 unit 必须是以下单位的其中一个:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。
127.0.0.1:6379[1]> geodist china:city beijing shanghai
"1067597.9668"
127.0.0.1:6379[1]> geodist china:city beijing shanghai km
"1067.5980"
127.0.0.1:6379[1]> 

  

默认单位是米

GEORADIUS

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

127.0.0.1:6379[1]> GEORADIUS china:city 100 100 50 km

(error) ERR invalid longitude,latitude pair 100.000000,100.000000

说明:经纬度超出了redis定义的范围

搜索附近的小伙伴,半径:1000km

127.0.0.1:6379[1]> GEORADIUS china:city 116 39 1000 km
1) "beijing"
2) "xian"
3) "shanghai"
127.0.0.1:6379[1]> 

  

搜索附近的小伙伴,前提是:所有的小伙伴得在China:city这个集合中才行。

例子:查询以坐标(116,39 )为中心,半径1000 km的小伙伴有哪些

127.0.0.1:6379[1]> GEORADIUS china:city 116 39 1000 km withdist
1) 1) "beijing"
   2) "106.5063"
2) 1) "xian"
   2) "883.1587"
3) 1) "shanghai"
   2) "996.7313"
127.0.0.1:6379[1]> GEORADIUS china:city 116 39 1000 km withcoord
1) 1) "beijing"
   2) 1) "116.40528291463851929"
      2) "39.9049884229125027"
2) 1) "xian"
   2) 1) "125.14903753995895386"
      2) "42.92699958624972822"
3) 1) "shanghai"
   2) 1) "121.47264629602432251"
      2) "31.23170490709807012"
127.0.0.1:6379[1]> GEORADIUS china:city 116 39 1000 km withcoord withdist
1) 1) "beijing"
   2) "106.5063"
   3) 1) "116.40528291463851929"
      2) "39.9049884229125027"
2) 1) "xian"
   2) "883.1587"
   3) 1) "125.14903753995895386"
      2) "42.92699958624972822"
3) 1) "shanghai"
   2) "996.7313"
   3) 1) "121.47264629602432251"
      2) "31.23170490709807012"

  

Count:表示显示几个小伙伴

127.0.0.1:6379[1]> GEORADIUS china:city 116 39 1000 km withcoord withdist count 1
1) 1) "beijing"
   2) "106.5063"
   3) 1) "116.40528291463851929"
      2) "39.9049884229125027"
127.0.0.1:6379[1]> GEORADIUS china:city 116 39 1000 km withcoord withdist count 2
1) 1) "beijing"
   2) "106.5063"
   3) 1) "116.40528291463851929"
      2) "39.9049884229125027"
2) 1) "xian"
   2) "883.1587"
   3) 1) "125.14903753995895386"
      2) "42.92699958624972822"
127.0.0.1:6379[1]> GEORADIUS china:city 116 39 1000 km withcoord withdist count 4
1) 1) "beijing"
   2) "106.5063"
   3) 1) "116.40528291463851929"
      2) "39.9049884229125027"
2) 1) "xian"
   2) "883.1587"
   3) 1) "125.14903753995895386"
      2) "42.92699958624972822"
3) 1) "shanghai"
   2) "996.7313"
   3) 1) "121.47264629602432251"
      2) "31.23170490709807012"
127.0.0.1:6379[1]> 

  

GEORADIUSBYMEMBER

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

指定成员的位置被用作查询的中心。

例子:找出以北京为中心,1000km为半径都有哪些城市

 

127.0.0.1:6379[1]> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379[1]> 

 

  

GEOHASH

返回一个或多个位置元素的 Geohash 表示。

通常使用表示位置的元素使用不同的技术,使用Geohash位置52点整数编码。由于编码和解码过程中所使用的初始最小和最大坐标不同,编码的编码也不同于标准。此命令返回一个标准的Geohash,在维基百科geohash.org网站都有相关描述

简单的说:将城市的经纬度转化为hash值,这个一般情况下我们使用不到。

将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越近!

 

127.0.0.1:6379[1]> GEOHASH china:city beijing shanghai
1) "wx4g0b7xrt0"
2) "wtw3sjt9vg0"
127.0.0.1:6379[1]> 
Geo底层的实现原理其实就是Zset !我们可以使用zset命令来操作geo  !
#查看集合中的元素,以及移除集合中的摸个元素!
127.0.0.1:6379[1]> ZRANGE china:city 0 -1
1) "chongqi"
2) "shenzheng"
3) "hangzhou"
4) "shanghai"
5) "beijing"
6) "xian"
127.0.0.1:6379[1]> ZREM china:city xian
(integer) 1
127.0.0.1:6379[1]> ZRANGE china:city 0 -1
1) "chongqi"
2) "shenzheng"
3) "hangzhou"
4) "shanghai"
5) "beijing"
127.0.0.1:6379[1]> 

 

  

HyperLogLog

是一种概率数据结构,用于对唯一事物进行计数(从技术上讲,这是用来求集合的基数)。

A={1,3,5,7,8,7} B={1,3,5,7,8}

这两个集合的基数是:1,3,5,7,8

基数说白了就是不重复的元素。

简介:Redis 2.8.9版本更新了Hyperloglog的数据结构!

Redis Hyperloglog基数统计的算法!

优点:占用的内存是固定的,2^64不同的元素的技术,只需要占用12kb的内存!如果要从内存的角度来比较的话,他绝对是首选!

网页的访问量UV

传统的方式:使用set集合保存用户的ID,然后就可以统计set中的元素数量作为判断标准!

这种方式如果保存大量的用户ID,就会比较麻烦!我们的目的是为了计数,而不是保存用户ID!

127.0.0.1:6379[1]> pfadd mykey a b c d e f
(integer) 1
127.0.0.1:6379[1]> pfadd mykey2 f g h i j k
(integer) 1
127.0.0.1:6379[1]> pcount mykey
(error) ERR unknown command `pcount`, with args beginning with: `mykey`, 
127.0.0.1:6379[1]> pfcount mykey
(integer) 6
127.0.0.1:6379[1]> PFMERGE mykey3 mykey mykey2 #将集合1和集合2合并到集合3中,注意:集合3是不存在的
OK
127.0.0.1:6379[1]> pfcount mykey3 #统计有多少个基数 并集操作
(integer) 11
127.0.0.1:6379[1]> 

  

如果允许容错,一定要使用它。

如果不允许容错,那么就使用set,或者自己创建的数据类型即可!

 

 

 

posted on 2020-09-30 21:08  ~码铃薯~  阅读(241)  评论(0编辑  收藏  举报

导航