Redis 三种特殊数据类型

geospatial地理位置

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作

Redis GEO 操作方法有:

  • geoadd:添加地理位置的坐标。
    GEOADD key longitude(经度) latitude(纬度) member(位置名称) [longitude latitude member ...]
  • geopos:获取地理位置的坐标。
    GEOPOS key member(位置名称) [member ...]
  • geodist:计算两个位置之间的距离。
    GEODIST key member1(位置名称) member2(位置名称) [m|km|ft|mi](单位)
  • georadius:根据经纬度坐标来获取指定范围内的地理位置。
    GEORADIUS key longitude latitude radius(半径) m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
  • georadiusbymember:根据位置名称获取指定范围内的地理位置。
    GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
  • geohash:位置的 geohash 值。
    GEOHASH key member [member ...]

参数说明:

  • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
  • WITHCOORD: 将位置元素的经度和维度也一并返回。
  • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
  • COUNT 限定返回的记录数。
  • ASC: 查找结果根据距离从近到远排序。
  • DESC: 查找结果根据从远到近排序。

 测试使用

127.0.0.1:6379> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2

127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km WITHDIST 
1) 1) "Palermo" #位置名称
   2) "190.4424" #当前位置与指定位置的距离
2) 1) "Catania"
   2) "56.4413"
127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km WITHCOORD
1) 1) "Palermo" #位置名称
   2) 1) "13.36138933897018433" #当前位置经度
      2) "38.11555639549629859" #当前位置纬度
2) 1) "Catania"
   2) 1) "15.08726745843887329"
      2) "37.50266842333162032"
127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km WITHDIST WITHCOORD
1) 1) "Palermo" #位置名称
   2) "190.4424" #当前位置与指定位置的距离
   3) 1) "13.36138933897018433" #当前位置经度
      2) "38.11555639549629859" #当前位置纬度
2) 1) "Catania"
   2) "56.4413"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"

127.0.0.1:6379> GEOADD Sicily 13.583333 37.316667 "Agrigento"
(integer) 1
127.0.0.1:6379> GEORADIUSBYMEMBER Sicily Agrigento 100 km #指定位置的指定范围中的地理位置
1) "Agrigento" #位置名称
2) "Palermo" #位置名称
127.0.0.1:6379> GEOHASH Sicily Palermo Catania #位置的geohash值
1) "sqc8b49rny0"
2) "sqdtr74hyu0"

Redis HyperLogLog

Redis HyperLogLog 是用来做基数统计的算法

什么是基数

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

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

基数(不重复元素)为5

优点:占用的内存是固定的,每个 HyperLogLog 键只需要花费 12 KB 内存

应用场景

网页的浏览量统计,一个人访问一个网站多次,之统计一次

传统方式,set(特点set内部元素不重复)保存用户id

测试使用

127.0.0.1:6379> pfadd mykey a b c d e f g a b c d e f g #添加
(integer) 1
127.0.0.1:6379> pfcount mykey #统计不重复的元素
(integer) 7
127.0.0.1:6379> pfadd mykey2 a b c d e f g h i j k l m n
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 14
127.0.0.1:6379> pfmerge mykey3 mykey mykey2 #合并集合
OK
127.0.0.1:6379> pfcount mykey3 #统计不重复的元素
(integer) 14

Redis BitMap(位存储)

通过一个bit位来表示某个元素对应的值或者状态(只有0或1两种状态)

1字节=8bit

位操作

 

127.0.0.1:6379> setbit mykey 1 1
(integer) 0
127.0.0.1:6379> setbit mykey 7 1
(integer) 0
127.0.0.1:6379> get mykey
"A"
127.0.0.1:6379> setbit mykey 9 1
(integer) 0
127.0.0.1:6379> get mykey
"A@"

应用场景

统计用户活跃、不活跃,用户签到、未签到,只要是两个状态的都可以使用BitMaps

用户签到

用户一年的签到情况

key:用户Id ,offset:日期(每天),value:签到情况(1:签到,0:未签到)

127.0.0.1:6379> setbit sign_user 0 0 #设置用户(sign_user)第一天未签到
(integer) 0
127.0.0.1:6379> setbit sign_user 1 1 #设置用户(sign_user)第二天签到
(integer) 0
127.0.0.1:6379> setbit sign_user 2 1 #设置用户(sign_user)第三天签到
(integer) 0
127.0.0.1:6379> setbit sign_user 4 0
(integer) 0
127.0.0.1:6379> setbit sign_user 5 1
(integer) 0
127.0.0.1:6379> setbit sign_user 364 0 #设置用户(sign_user)第365天未签到
(integer) 0
127.0.0.1:6379> getbit sign_user 3 #获取用户第三天签到情况
(integer)
1
127.0.0.1:6379> bitcount sign_user #返回一个指定key中位的值为1的个数
(integer)
3

统计每天的活跃用户数量

Key:日期,offset:用户ID,value:活跃度

127.0.0.1:6379> setbit 20210902 11 1
(integer) 0
127.0.0.1:6379> setbit 20210902 302 1
(integer) 0
127.0.0.1:6379> setbit 20210902 9527 1
(integer) 0
127.0.0.1:6379> bitCount 20210902
(integer) 3

 

posted @ 2021-09-01 16:30  一杯水M  阅读(101)  评论(0)    收藏  举报