Redis入门 三种特殊数据类型(Geospatial、Hyperloglog、Bitmap)命令详解

文章目录

  • Redis 三种特殊数据类型
    • Geospatial(地理位置)
    • Hyperloglog
    • Bitmap

Redis 三种特殊数据类型

Geospatial(地理位置)

朋友的定位,附近的人,位置共享
redis的geo 在3.2就已经推出了!两地之间的距离,方圆几里的人!都可以用它实现
这个需要把你所在地的经纬度输进去,所以我们随便找个网站:http://www.jsons.cn/lngcode/进行查询即可!

只有六个命令!
Redis入门 三种特殊数据类型(Geospatial、Hyperloglog、Bitmap)命令详解_第1张图片
官方文档:https://www.redis.net.cn/order/3685.html

geoadd 添加地理位置

有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。

当坐标位置超出上述指定范围时,该命令将会返回一个错误。

# 添加地理位置   
# 规则:两极无法直接添加,一般会下载城市数据包,直接通过Java程序导入!
# 参数 key 值(纬度,经度,名称)
127.0.0.1:6379> geoadd china:city 121.472644 31.231706 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 116.405285 39.904989 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 108.948024 34.263161 xian
(integer) 1
127.0.0.1:6379> geoadd china:city 106.504962 29.533155 chongqing 120.153576 30.287459 hangzhou
(integer) 2
127.0.0.1:6379> geoadd china:city 114.085947 22.547 shenzhen
(integer) 1

geopos

获得当前定位:一定是一个坐标值!

127.0.0.1:6379> GEOPOS china:city beijing #获取指定城市的经度和纬度
1) 1) "116.40528291463851929"
   2) "39.9049884229125027"
127.0.0.1:6379> GEOPOS china:city beijing xian
1) 1) "116.40528291463851929"
   2) "39.9049884229125027"
2) 1) "108.94802302122116089"
   2) "34.2631604414749944"

geodist

位置共享,返回两个人之间的距离(绝对路径)

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

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。
127.0.0.1:6379> geodist china:city beijing shenzhen
"1943024.0448"
127.0.0.1:6379> geodist china:city beijing shenzhen km #查看北京到深圳的直线距离 单位km
"1943.0240"

georadius

以给定的经纬度为中心,找出某一半径内的元素

附近的人?(获得所有附近的人的位置信息,打开定位!) 通过半径来查询!
获得指定数量的人!前提:所有的数据得在这个集合里面

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km #以110 30 为中心,获取方圆1000km内的城市
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "chongqing"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist withcoord count 1 #显示直线距离 和 坐标 只显示一个
1) 1) "chongqing"
   2) "341.4052"
   3) 1) "106.50495976209640503"
      2) "29.53315530684997015"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist withcoord count 2
1) 1) "chongqing"
   2) "341.4052"
   3) 1) "106.50495976209640503"
      2) "29.53315530684997015"
2) 1) "xian"
   2) "484.4073"
   3) 1) "108.94802302122116089"
      2) "34.2631604414749944"

georadiusbymember

找出指定元素周围的其他元素,用于导航!

127.0.0.1:6379> GEORADIUSBYMEMBER china:city xian 1000 km #查询西安周围1000km内的城市
1) "xian"
2) "chongqing"
3) "beijing"

GEOHASH

该命令将返回11个字符的Geohash字符串~

#将二维的经纬度转化为一维的字符串
127.0.0.1:6379> GEOHASH chaina:city beijing xian
1) "wx4g0b7xrt0"
2) "wqj6zjmt2u0"

geo的底层其实就是zset ,所以我们可以用zset的命令去操纵它

例如:移除一个城市

127.0.0.1:6379> ZRANGE chaina:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "beijing"
127.0.0.1:6379> zrem chaina:city hangzhou
(integer) 1
127.0.0.1:6379> ZRANGE chaina:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "beijing"

Hyperloglog

什么是基数?

A{1,3,6,7,5,6}
B{1,3,5,7,6}
两个的基数都(不重复的元素)=5,可以接受误差!

简介

redis 2.8.9版本就更新了Hyperloglog数据结构!
Hyperloglog:基数统计算法!0.81%的错误率,不过统计大量数据可以忽略!

优点:占用的内存是固定的,统计2^64这么大的基数,只占用12kb的内存,就很方便!
网页的uv统计(一个人访问多次网站,也算一个人)
传统的方式是用set集合把每个人的id保存下来,然后统计元素数量,但是这个太费
内存了,而且我们的目标是统计数量,现在还要浪费大量的空间,就很不划算!

测试使用

127.0.0.1:6379> pfadd key a b c #添加一点元素
(integer) 1
127.0.0.1:6379> PFCOUNT key   #统计基数
(integer) 3
127.0.0.1:6379> PFADD key2 b c d
(integer) 1
127.0.0.1:6379> PFCOUNT key2
(integer) 3
127.0.0.1:6379> PFCOUNT key key2  #可以这样统计两组中的基数
(integer) 4
127.0.0.1:6379> PFMERGE key3 key key2   #或者先把这两个组导入到一个组中再进行统计
OK
127.0.0.1:6379> PFCOUNT key3
(integer) 4
127.0.0.1:6379> pfadd key5 a a b   
(integer) 1
127.0.0.1:6379> PFCOUNT key5
(integer) 2

Bitmap

位存储

登录/未登录 活跃/不活跃 打卡

两个状态的都可以使用它!

Bitmap 位图:数据结构,都是操作二进制位来进行记录,只有0和1两种状态!

测试

比如记录一周的打卡情况!

周一:0没打卡,周二:1已打卡……

127.0.0.1:6379> setbit sign 1 0   
(integer) 0
127.0.0.1:6379> setbit sign 2 1
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0
127.0.0.1:6379> setbit sign 7 1
(integer) 0

查看某一天的打卡情况

127.0.0.1:6379> getbit sign 1
(integer) 0
127.0.0.1:6379> getbit sign 5
(integer) 1

统计打卡的天数

127.0.0.1:6379> BITCOUNT sign
(integer) 5

你可能感兴趣的:(Linux)