Redis的三大特殊类型

三大特殊基本类型

Geospatial

在线查询网址:http://www.jsons.cn/lngcodeinfo

本身有10个命令:

geoadd

--- 添加地理位置 geoadd ---
# EPSG:900913 / EPSG:3785 / OSGEO:41001 指定的确切限制如下:

# 有效经度为 -180 到 180 度。
# 有效纬度为 -85.05112878 到 85.05112878 度。
# 当用户尝试索引指定范围之外的坐标时,该命令将报告错误。
# 注意:没有GEODEL命令,因为您可以使用ZREM删除元素。Geo 索引结构只是一个排序集。

# 参数 key (经度纬度 城市名)
# 添加城市的坐标
127.0.0.1:6379> geoadd china:city   116.40 39.90 beijing   116.10 39.94 mentougou
(integer) 2
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai 121.42 31.22 changning
(integer) 2

geopos

--- 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 shanghai
1) 1) "121.47000163793563843"
   2) "31.22999903975783553"

GeoDIST

单位必须是以下之一,默认为米:

  • m为米。
  • 公里换公里。
  • 英里数英里。
  • 英尺换英尺。
--- geodist 测量两地的距离 ---
# 参数 两个元素的名字key 存在返回具体差值 不存在返回空
127.0.0.1:6379> GEODIST china:city beijing shanghai km
"1067.3788"
127.0.0.1:6379> GEODIST china:city beijing mentougou m
"25975.0369"
127.0.0.1:6379> GEODIST china:city beijing shanghai m
"1067378.7564"
127.0.0.1:6379> GEODIST china:city beijing mentougou km
"25.9750"
127.0.0.1:6379> GEODIST china:city beijing dongcheng km
(nil)

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

弃用通知: 从 Redis 版本 6.2.0 开始,此命令被视为已弃用。虽然它不太可能被完全删除,但最好使用带有 BYRADIUS 参数的 GEOSEARCHGEOSEARCHSTORE

--- 显示在这个半径范围内的城市 georadius ---
# 参数: 集合名字  经纬度  半径距离 单位 显示距离 显示经纬度  个数 
127.0.0.1:6379> georadius china:city 116 39 700 km #以116,39为中心,寻找半径700km的元素
1) "mentougou"
2) "beijing"
127.0.0.1:6379> georadius china:city 116 39 700 km withdist # 显示到中心的距离
1) 1) "mentougou"
   2) "104.9047"
2) 1) "beijing"
   2) "105.8343"
127.0.0.1:6379> georadius china:city 116 39 700 km withdist withcoord # 显示距离并显示经纬度
1) 1) "mentougou"
   2) "104.9047"
   3) 1) "116.09999924898147583"
      2) "39.94000052628644681"
2) 1) "beijing"
   2) "105.8343"
   3) 1) "116.39999896287918091"
      2) "39.90000009167092543"
127.0.0.1:6379> georadius china:city 116 39 700 km withdist withcoord count 1 #限制显示的个数
1) 1) "mentougou"
   2) "104.9047"
   3) 1) "116.09999924898147583"
      2) "39.94000052628644681"
127.0.0.1:6379> georadius china:city 116 39 700 km withdist withcoord count 2
1) 1) "mentougou"
   2) "104.9047"
   3) 1) "116.09999924898147583"
      2) "39.94000052628644681"
2) 1) "beijing"
   2) "105.8343"
   3) 1) "116.39999896287918091"
      2) "39.90000009167092543"

georadiusbymember 根据成员去查找在半径范围内的元素

弃用通知: 从 Redis 版本 6.2.0 开始,此命令被视为已弃用。虽然它不太可能被完全删除,但最好使用带有 BYRADIUSFROMMEMBER 参数的 GEOSEARCHGEOSEARCHSTORE 来代替。

127.0.0.1:6379> georadiusbymember china:city beijing 100 km
1) "mentougou"
2) "beijing"

GEOSEARCH

--- GEOSEARCH ---
# 参数 FROMMEMBER|FROMLONLAT (元素或者经纬度)
#     BYBOX|BYRADIUS(查询的形状是矩形还是圆形)
#	  WITHDIST: 也返回返回的物品到指定中心点的距离。距离返回的单位与为半径或高度和宽度参数指定的单位相同。
#	  WITHCOORD: 同时返回匹配项的经度和纬度。
#	  WITHHASH:还以 52 位无符号整数的形式返回项目的原始 geohash 编码排序集分数。这仅对低级 hack 或调试 #     有用,否则对一般用户来说没什么兴趣。
#	  ASC|DESC:返回结果是升序还是降序
#	  COUNT:返回结果的个数
127.0.0.1:6379> geosearch china:city frommember beijing bybox 500 500 km asc withdist
1) 1) "beijing"
   2) "0.0000"
2) 1) "mentougou"
   2) "25.9750"
3) 1) "cangzhou"
   2) "181.0638"
# 展示两条数据
127.0.0.1:6379> geosearch china:city frommember beijing bybox 500 500 km asc withdist count 2
1) 1) "beijing"
   2) "0.0000"
2) 1) "mentougou"
   2) "25.9750"
# 根据经纬度 矩形 查询
127.0.0.1:6379> geosearch china:city fromlonlat 116 39 bybox 500 500 km asc withdist 
1) 1) "mentougou"
   2) "104.9047"
2) 1) "beijing"
   2) "105.8343"
3) 1) "cangzhou"
   2) "106.4923"
# 经纬度 圆形查询
127.0.0.1:6379> geosearch china:city fromlonlat 116 39 byradius 500 km asc withdist 
1) 1) "mentougou"
   2) "104.9047"
2) 1) "beijing"
   2) "105.8343"
3) 1) "cangzhou"
   2) "106.4923"
127.0.0.1:6379> geosearch china:city fromlonlat 116 39 byradius 500 km asc withdist withhash
1) 1) "mentougou"
   2) "104.9047"
   3) (integer) 4069877169470993
2) 1) "beijing"
   2) "105.8343"
   3) (integer) 4069885360207904
3) 1) "cangzhou"
   2) "106.4923"
   3) (integer) 4068967794579016

GEOSEARCHSTORE

# 这个命令类似于 GEOSEARCH 命令,只不过是把查出来的数据放到了一个新的key里面
127.0.0.1:6379> geosearchstore key1  china:city fromlonlat 116 39 byradius 500 km asc 
(integer) 3
127.0.0.1:6379> GEOSEARCH key1 fromlonlat 116 39 byradius 500 km asc withcoord withhash withdist
1) 1) "mentougou"
   2) "104.9047"
   3) (integer) 4069877169470993
   4) 1) "116.09999924898147583"
      2) "39.94000052628644681"
2) 1) "beijing"
   2) "105.8343"
   3) (integer) 4069885360207904
   4) 1) "116.39999896287918091"
      2) "39.90000009167092543"
3) 1) "cangzhou"
   2) "106.4923"
   3) (integer) 4068967794579016
   4) 1) "116.84999853372573853"
      2) "38.30999992507150864"

GEO底层实现原理就是一个ZSET!我们可以使用zset命令来操作GEO

#查看集合中的所有元素
127.0.0.1:6379> zrange key1 0 -1
1) "cangzhou"
2) "mentougou"
3) "beijing"
#移除元素
127.0.0.1:6379> zrem key1 cangzhou 
(integer) 1
127.0.0.1:6379> zrange key1 0 -1
1) "mentougou"
2) "beijing"

Hyperloglog

什么是基数?

A{1,3,5,7,8,9}

B{1,3,5,7,9}

基数就是不重复的数,可以接受误差

简介

优点:占用的内存是固定的2^64不同的元素技术,只需要费12kb内存如果要从内存角度进行比较的话,Hyperloglog可以当做首选

网页的UV(一个人访问多次算作一个访问量)

传统的方法是set保存用户的ID,然后就可以统计set中的元素数量进行判断

这个方法如果保存大量的ID,就会比较麻烦,我们的目的是计数,而不是保存用户的ID

0.18%的错误率!统计UV任务,可以忽略不计

测试使用

 127.0.0.1:6379> pfadd myset a b c d e f g  # 添加数据
(integer) 1
127.0.0.1:6379> pfcount myset #统计元素的基数数量
(integer) 7
127.0.0.1:6379> pfadd myset2 a b e g h j k l o p
(integer) 1
127.0.0.1:6379> pfcount myset2
(integer) 10
127.0.0.1:6379> PFMERGE myset3 myset myset2  #合并两组到第三组里 myset+myset2=>myset3
OK
127.0.0.1:6379> pfcount myset3
(integer) 13

注:如果允许容错,UV任务的时候就可以使用Hyperloglog

Bitmaps

位运算

统计用户信息,活跃,不活跃,登录,未登录!打卡,未打卡,365打卡!两个状态的,都可以用BitMaps!

BitMaps位图,数据结构,都是操作二进制为进行记录,就只有0,1两种状态

#设置周一到周日的打卡记录
127.0.0.1:6379> setbit mybit 0 1
(integer) 0
127.0.0.1:6379> setbit mybit 1 0
(integer) 0
127.0.0.1:6379> setbit mybit 2 1
(integer) 0
127.0.0.1:6379> setbit mybit 3 1
(integer) 0
127.0.0.1:6379> setbit mybit 4 0
(integer) 0
127.0.0.1:6379> setbit mybit 5 0
(integer) 0
#获取指定日期的打卡记录
127.0.0.1:6379> getbit mybit 3
(integer) 1
127.0.0.1:6379> getbit mybit 5
(integer) 0
#统计打卡天数
127.0.0.1:6379> bitcount mybit
(integer) 3

上一篇:DOC常用命令


下一篇:Introduction to self-driving cars-W4_Kinematic_Bicycle_Model 车辆动力学模型