美文网首页
3、Redis的三种特殊数据类型

3、Redis的三种特殊数据类型

作者: i小雨 | 来源:发表于2020-10-20 18:50 被阅读0次

    1、geospatial地理位置:

    1603186630(1).jpg
    • GEOADD:

    将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
    语法:GEOADD key longitude latitude member[longitude latitude member ...]

    ##########################################################
    # GEOADD 命令以标准的 x,y 格式接受参数, 所以用户必须先输入经度, 然后再输入纬度。
    # 有效的经度介于 -180 度至 180 度之间。
    # 有效的纬度介于 -85.05112878 度至 85.05112878 度之间。
    ##########################################################
    127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijin
    (integer) 1
    127.0.0.1:6379> GEOADD china:city 121.472644 31.231706 shanghai 114.085947 22.547 shenzhen 114.298572 30.584355 wuhan
    (integer) 3
    ##########################################################
    
    • GEOPOS:

    从key里返回所有给定位置元素的位置(经度和纬度)。
    语法:GEOPOS key member [member ...]

    127.0.0.1:6379> GEOPOS china:city wuhan   #获取指定城市的经度纬度
    1) 1) "114.29857403039932251"
       2) "30.58435486605102227"
    127.0.0.1:6379> GEOPOS china:city beijin shanghai
    1) 1) "116.39999896287918091"
       2) "39.90000009167092543"
    2) 1) "121.47264629602432251"
       2) "31.23170490709807012"
    
    • GEODIST:

    返回两个给定位置之间的距离。
    语法:GEODIST key member1 member2 [unit]

    ##########################################################
    #如果两个位置之间的其中一个不存在,那么命令返回空值。
    #指定单位的参数 unit 必须是以下单位的其中一个:
    #  m 表示单位为米。
    #  km 表示单位为千米。
    #  mi 表示单位为英里。
    #  ft 表示单位为英尺。
    #如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
    ##########################################################
    127.0.0.1:6379> GEODIST china:city wuhan shenzhen  #查看武汉到深圳的直线距离
    "894214.7596"
    127.0.0.1:6379> GEODIST china:city wuhan shenzhen km
    "894.2148"
    
    ##########################################################
    
    • GEORADIUS:

    以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
    语法:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

    ##########################################################
    #范围可以使用以下其中一个单位:
    # m 表示单位为米。
    # km 表示单位为千米。
    # mi 表示单位为英里。
    # ft 表示单位为英尺。
    #在给定以下可选项时, 命令会返回额外的信息:
    #  WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
    #  WITHCOORD: 将位置元素的经度和维度也一并返回。
    #  WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
    #命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:
    #  ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
    #  DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。
    在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT <count> 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。
    ##########################################################
    127.0.0.1:6379> GEORADIUS china:city 110 30 800 km
    1) "wuhan"
    127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km
    1) "shenzhen"
    2) "wuhan"
    127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist
    1) 1) "shenzhen"
       2) "923.4929"
    2) 1) "wuhan"
       2) "417.8920"
    127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord
    1) 1) "shenzhen"
       2) 1) "114.08594459295272827"
          2) "22.54699993773966327"
    2) 1) "wuhan"
       2) 1) "114.29857403039932251"
          2) "30.58435486605102227"
    
    ##########################################################
    
    • GEORADIUSBYMEMBER:

    指定成员的位置被用作查询的中心。(和GEORADIUS类似)
    语法:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

    127.0.0.1:6379> GEORADIUSBYMEMBER china:city wuhan 1000 km
    1) "shenzhen"
    2) "wuhan"
    3) "shanghai"
    127.0.0.1:6379> GEORADIUSBYMEMBER china:city wuhan 1000 km withdist
    1) 1) "shenzhen"
       2) "894.2148"
    2) 1) "wuhan"
       2) "0.0000"
    3) 1) "shanghai"
       2) "688.2824"
    
    • GEOHASH:

    返回一个或多个位置元素的 Geohash 表示。(11位)
    语法:GEOHASH key member [member ...]

    #将二维的经纬度转换为一维的字符串表示
    127.0.0.1:6379> GEOHASH china:city wuhan shenzhen
    1) "wt3mbztwvb0"
    2) "ws10k0dcg10"
    

    小结:GEO底层的实现原理就是Zset,因此我们可以使用Zset命令操作GEO

    127.0.0.1:6379> ZRANGE china:city 0 -1   #查询所有的城市
    1) "shenzhen"
    2) "wuhan"
    3) "shanghai"
    4) "beijin"
    127.0.0.1:6379> ZREM china:city shanghai   #删除一个元素
    (integer) 1
    127.0.0.1:6379> ZRANGE china:city 0 -1
    1) "shenzhen"
    2) "wuhan"
    3) "beijin"
    
    

    2、HyperLogLogs:

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

    什么是基数?

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

    使用

    127.0.0.1:6379> PFADD key1 1 2 3 4 5 6 7   #创建第一组元素
    (integer) 1
    127.0.0.1:6379> PFCOUNT key1     #统计第一组元素基数数量
    (integer) 7
    127.0.0.1:6379> PFADD key2 6 6 7 7 8 9 10
    (integer) 1
    127.0.0.1:6379> PFCOUNT key2
    (integer) 5
    127.0.0.1:6379> PFMERGE key3 key1 key2    #合并两组元素到key3中(并集)
    OK 
    127.0.0.1:6379> PFCOUNT key3
    (integer) 10
    
    

    3、bitmaps

    位存储

    应用:如统计用户登陆状态(登录和未登录),记录打卡(265天)
    Bitmap位图是通过操作二进制来进行记录,只有0或者1两个状态

    测试
    向week1中放进七天的打卡数据,1代表打卡,0代表未打卡

    127.0.0.1:6379> SETBIT week1 1 1
    (integer) 0
    127.0.0.1:6379> SETBIT week1 2 1
    (integer) 0
    127.0.0.1:6379> SETBIT week1 3 1
    (integer) 0
    127.0.0.1:6379> SETBIT week1 4 1
    (integer) 0
    127.0.0.1:6379> SETBIT week1 5 1
    (integer) 0
    127.0.0.1:6379> SETBIT week1 6 0
    (integer) 0
    127.0.0.1:6379> SETBIT week1 7 0
    (integer) 0
    

    查看某一天是否打卡:(GETBIT)

    127.0.0.1:6379> GETBIT week1 1   #查看周一是否打卡
    (integer) 1
    127.0.0.1:6379> GETBIT week1 6   #查看周六是否打卡
    (integer) 0
    

    统计打卡的天数:(BITCOUNT )

    127.0.0.1:6379> BITCOUNT week1   #统计打卡的天数
    (integer) 5                      #打卡天数为5天
    

    相关文章

      网友评论

          本文标题:3、Redis的三种特殊数据类型

          本文链接:https://www.haomeiwen.com/subject/bzwdmktx.html