Redis三种特殊类型
2023年3月10日00:52:28
特殊类型说明
Geospatial(地理信息)
- 在redis3.2版本就推出了
- 用来计算地理位置信息
- 计算两地之间的距离
- 获取地理范围内的人数
- 有效经度范围-180 ~ 180,有效纬度范围-85 ~ 85
- m 米
- km 千米
- mi 英里
- ft 英尺
#获取城市地理位置测试数据 http://www.jsons.cn/lngcode/
################### GEOADD命令###################
#GEOADD 添加城市坐标
#GEOADD 经度 维度 坐标名称(城市名、人名)
#在key city下添加6个城市的坐标
127.0.0.1:6379[1]> geoadd city 120.864608 32.016212 nantong
(integer) 1
127.0.0.1:6379[1]> geoadd city 121.49295 31.22337 shanghai
(integer) 1
127.0.0.1:6379[1]> geoadd city 104.065735 30.659462 chengdu
(integer) 1
127.0.0.1:6379[1]> geoadd city 116.405285 39.904989 beijing
(integer) 1
127.0.0.1:6379[1]> geoadd city 113.280637 23.125178 guangzhou
(integer) 1
127.0.0.1:6379[1]> geoadd city 114.298572 30.584355 wuhan
(integer) 1
################### GEOPOS命令###################
#GEOPOS 获取指定城市坐标值
#GEOPOS key 坐标名称
#获取两个城市的精度维度坐标
127.0.0.1:6379[1]> geopos city nantong shanghai
1) 1) "120.8646056056022644"
2) "32.01621124479810732"
2) 1) "121.49295061826705933"
2) "31.22337074392616074"
################### GEODIST命令###################
#GEODIST 获取两个坐标之间的距离
#GEODIST key 坐标1 坐标2 单位
#获取武汉和成都的直线距离单位是km
127.0.0.1:6379[1]> geodist city wuhan chengdu km
"979.1380"
#获取上海和南通的直线距离单位是km
127.0.0.1:6379[1]> geodist city shanghai nantong km
"106.3872"
#获取北京和成都的直线距离单位是km
127.0.0.1:6379[1]> geodist city beijing chengdu km
"1517.9907"
################### GEORADIUS命令###################
#GEORADIUS 根据经纬度获取指定距离范围内的其他坐标
#GEORADIUS key 指定经度 指定维度 距离 单位
#获取在city的坐标数据中,距离精度110 维度30 这个坐标,范围在1000km内的其他坐标
127.0.0.1:6379[1]> georadius city 110 30 1000 km
1) "chengdu"
2) "guangzhou"
3) "wuhan"
#获取在city的坐标数据中,距离精度110 维度30 这个坐标,范围在1000km内的其他坐标 withcoord并显示具体的经纬度
127.0.0.1:6379[1]> georadius city 110 30 1000 km withcoord
1) 1) "chengdu"
2) 1) "104.06573742628097534"
2) "30.65946118872339099"
2) 1) "guangzhou"
2) 1) "113.28063815832138062"
2) "23.12517743834835215"
3) 1) "wuhan"
2) 1) "114.29857403039932251"
2) "30.58435486605102227"
#获取在city的坐标数据中,距离精度110 维度30 这个坐标,范围在1000km内的其他坐标 withdist并显示距离
127.0.0.1:6379[1]> georadius city 110 30 1000 km withdist
1) 1) "chengdu"
2) "574.3396"
2) 1) "guangzhou"
2) "831.2636"
3) 1) "wuhan"
2) "417.8920"
#获取在city的坐标数据中,距离精度110 维度30 这个坐标,范围在1000km内的其他坐标 withdist并显示距离、withcoord显示经纬度、count 1 只显示满足条件的一条数据
127.0.0.1:6379[1]> georadius city 110 30 1000 km withdist withcoord count 1
1) 1) "wuhan"
2) "417.8920"
3) 1) "114.29857403039932251"
2) "30.58435486605102227"
################### GEORADIUSBYMEMBER命令###################
#GEORADIUSBYMEMBER 根据坐标名称获取指定距离范围内的其他坐标
#GEORADIUSBYMEMBER key member 距离 单位
#获取key的member中上海周围800km范围内的3个城市,并显示距离经纬度和距离
127.0.0.1:6379[1]> georadiusbymember city shanghai 800 km withcoord withdist count 3
1) 1) "shanghai"
2) "0.0000"
3) 1) "121.49295061826705933"
2) "31.22337074392616074"
2) 1) "nantong"
2) "106.3872"
3) 1) "120.8646056056022644"
2) "32.01621124479810732"
3) 1) "wuhan"
2) "690.1423"
3) 1) "114.29857403039932251"
2) "30.58435486605102227"
################### GEOHASH命令###################
#GEOHASH 将多个成员的经纬度转换为字符串,如果两个字符串越相似,则说明位置越接近
#GEOHASH key member1 member2 ...
#获取shanghai和nantong的经纬度hash
127.0.0.1:6379[1]> geohash city shanghai nantong
1) "wtw3ssh3qf0"
2) "wttynk6gvq0"
- GEO的底层实现其实及时Zset,所以我们可以使用Zset命令操作GEO数据
#zrange 获取所有member
127.0.0.1:6379[1]> zrange city 0 -1
1) "chengdu"
2) "guangzhou"
3) "wuhan"
4) "shanghai"
5) "nantong"
6) "beijing"
#zrem 删除一个元素,GEO的命令是没有删除的,我们可以用zrem来删除
127.0.0.1:6379[1]> zrem city nantong
(integer) 1
127.0.0.1:6379[1]> zrange city 0 -1
1) "chengdu"
2) "guangzhou"
3) "wuhan"
4) "shanghai"
5) "beijing"
Hyperloglog(大数据统计)
- 用来做基数统计的算法
- 获取网页的访问量
- 内存占用很小(kb)
- 存在一定的误差(0.85%)
#PFADD key value1 value2 ...
#给site1下面添加一些数据
127.0.0.1:6379[1]> PFADD site1 a b c d e f g h
(integer) 1
#给site2下面添加一些数据
127.0.0.1:6379[1]> PFADD site2 c d f g h j k s
(integer) 1
#PFCOUNT key 统计数量
127.0.0.1:6379[1]> PFCOUNT site1
(integer) 8
127.0.0.1:6379[1]> PFCOUNT site2
(integer) 8
#PFMERGE key3 key1 key2 将key1 key2 中的数据合并到key3
#将site1和site2中的数据合并到site3
127.0.0.1:6379[1]> PFMERGE site3 site1 site2
OK
#获取site3中元素数量,已经去重
127.0.0.1:6379[1]> PFCOUNT site3
(integer) 11
- 需要允许一定的误差
- 如果不允许误差需要使用其他办法处理,比如set
Bitmaps(位存储)
- 统计用户信息(是否活跃、是否打卡、是否登陆)
- 位图,操作二进制位来进行记录,只有0和1两个状态
- 省内存
#setbit key offset value
#场景:设置user1 第1天 打卡 (打卡1 未打卡0)
127.0.0.1:6379[1]> setbit user1 0 1
(integer) 0
#设置user1 第2天 打卡
127.0.0.1:6379[1]> setbit user1 1 1
(integer) 0
#设置user1 第3天 打卡
127.0.0.1:6379[1]> setbit user1 2 1
(integer) 0
#设置user1 第4天 未打卡
127.0.0.1:6379[1]> setbit user1 3 0
(integer) 0
#设置user1 第5天 未打卡
127.0.0.1:6379[1]> setbit user1 4 0
(integer) 0
#设置user1 第6天 打卡
127.0.0.1:6379[1]> setbit user1 5 1
(integer) 0
#设置user1 第7天 未打卡
127.0.0.1:6379[1]> setbit user1 6 0
(integer) 0
#查看user1 第5天是否打卡
127.0.0.1:6379[1]> getbit user1 4
(integer) 0
127.0.0.1:6379[1]> getbit user1 5
(integer) 1
#查看user1 打卡的天数 (统计被设置的二进制位数量)
127.0.0.1:6379[1]> bitcount user1
(integer) 4
- bitmap是位操作,用于存储bool这种只有两个状态的数据
- 可以用来存储打卡数据,使用位图这种数据结构存储非常节省空间