三种特殊数据类型

geospatial 地理位置

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

Redis 的 Geo,这个功能可以推算地理位置信息,两地之间的距离,方圆几里的人。

只有六个命令:

geoadd 添加地理位置

规则:两级无法直接添加,我们一般会下载城市数据,直接通过 java 程序一次性导入

参数 key 值(经度、纬度、名称)

127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.08 22.54 shenzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
geopos 获取当前定位 一定是一个坐标值

获取指定城市的经度和纬度

127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city beijing chongqing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "106.49999767541885376"
   2) "29.52999957900659211"
geodist

两人之间的距离

单位:

  • m 米
  • km 千米
  • mi 英里
  • ft 英尺
127.0.0.1:6379> geodist china:city beijing shanghai
"1067378.7564"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"
127.0.0.1:6379> geodist china:city beijing chongqing km
"1464.0708"
georadius 以给定的经纬度为中心,找出某一半径内的元素

附近的人(获得所有附近的人的住址,定位)通过半径来查询

获得指定数量的人

所有数据应该都录入:china:city 才会让结果更加清晰

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km    #以 100 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 500 km withdist        # 显示到中心距离的位置
1) 1) "chongqing"
   2) "341.9374"
2) 1) "xian"
   2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord    # 显示出他人的定位信息
1) 1) "chongqing"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 1    # 筛选出指定的结果
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 3
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6379>
georadiusbymember

找出位于指定元素周围的其他元素

127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> georadiusbymember china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
geohash

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

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

127.0.0.1:6379> GEOHASH china:city beijing chongqing
1) "wx4fbxxfke0"
2) "wm5xzrybty0"
GEO 底层实现原理其实就是 Zset,可以使用 Zet 命令来操作 GEO
127.0.0.1:6379> zrange china:city 0 -1    # 查看地图中全部元素
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city beijing        # 移除指定元素
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"

hyperloglog

基数:不重复的元素,可以接受误差

hyperloglog 简介

是一种数据结构,用来做基数统计的算法

优点:占用内存是固定的

127.0.0.1:6379> PFADD mykey a b c d e f g h i j        # 创建第一组元素
(integer) 1
127.0.0.1:6379> PFCOUNT mykey        # 统计 mykey 中元素的基数数量
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j z x c v b n m        # 创建第二组元素
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 9
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2        # 合并两组 mykey mykey2 => mykey3  并集
OK
127.0.0.1:6379> PFCOUNT mykey3    # 查看并集的数量
(integer) 15

如果允许容错,那么一定可以使用 Hyperloglog

bitmap

位存储

统计用户信息,活跃/不活跃,登录/未登录,打卡/未打卡等这种两个状态的,都可以使用 bitmap

bitmap 叫位图,也是一种数据结构,都是操作二进制位来进行记录,就只有 0 和 1 两个状态。

使用 bitmaps 来记录周一到周日的打卡:

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

查看某一天是否有打卡:

127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 6
(integer) 0

统计操作,统计打卡的天数:

127.0.0.1:6379> BITCOUNT sign    # 统计这周的打卡记录,就可以看到是否有全勤
(integer) 3