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