学习总结,转自【狂神说Java】Redis最新超详细版教程通俗易懂_哔哩哔哩_bilibili
1.Geospatial 地理位置
Geospatial : 使用场景 :朋友的定位,方圆几公里得人(附近的人),判断两地之间直线距离
注意事项:
设置/获取经纬度
//添加地理位置,格式(经度,维度,名称)
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing
(integer) 1
//获取指定城市的经纬度
127.0.0.1:6379> getpos china:city hangzhou beijing
1) 1) "116.39999896287918"
2) "39.900000091670925"
查看距离
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么
GEODIST
默认使用米作为单位。GEODIST
命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差
//查看距离
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"
找出半径内的城市
//给定的经纬度为中心,找出单位半径内的城市
georadius china:city 110 30 1000 km
1) "chongqing"
找出半径内的城市显示支线距离
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "chongqing"
2) "341.9374"
找出半径内的城市并显示经纬度
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord
1) 1) "chongqing"
2) 1) "106.49999767541885"
2) "29.529999579006592"
批量展示半径内的城市并显示经纬度及直线距离
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.49999767541885"
2) "29.529999579006592"
找出指定元素周围的其他元素
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"
将二维的经纬度转为一维的字符串(11位),字符串约相同,代表经纬度约接近
127.0.0.1:6379> geohash china:city beijing chongqing
1) "wx4fbxxfke0"
2) "wm5xzrybty0"
geo的底层实现原理是Zset,可以使用Zset操作geo
//查看所有城市
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "shanghai"
3) "beijing"
//移除指定元素
127.0.0.1:6379> zrem china:city shanghai
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "beijing"
2.Hyperloglog
统计基数的算法
优点:占用的内存固定2^64,不同元素的数据只需要12KB的内存,但是会有0.81%的错误率
例如统计网站使用用户数量时,传统的方式使用set保存用户id,统计set中的元素数量进行判断,存储大量id就比较麻烦,
如果在不考虑容错的情况下,推荐使用Hyperloglog存储,
如果不允许容错,就是要set或自己的数据类型即可
//创建第一组元素
127.0.0.1:6379> PFADD mykey a b c d e f g h i j
(integer) 1
//统计元素mykey基数数量
127.0.0.1:6379> PFCOUNT mykey
(integer) 10
//创建第二组元素
127.0.0.1:6379> PFADD mykey2 i j z x c v b n m
(integer) 1
//统计元素mykey2基数数量
127.0.0.1:6379> PFCOUNT mykey2
(integer) 9
//合并两组 mykey mykey2 至 mykey3
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2
ok
//查看并集数量
127.0.0.1:6379> PFCOUNT mykey2
(integer) 15
3.BatMap
主要用于统计用户信息,活跃/不活跃,登录/未登录,两种状态的都可以使用BatMap进行记录,
使用BatMap位图,数据结构,都是二进制操作进行记录,只有0和1两种
例:以使用BatMap存储员工每天打卡情况(0为未打卡,1为打卡)
//s设置员工一周打卡情况
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> getbit sign 3
//返回1 ,代表当天打卡
127.0.0.1:6379> getbit sign 6
//返回0 代表未打卡
//统计打卡天数
127.0.0.1:6379> bitcount sign
//返回 3 代表员工本周打卡三天