三种特殊数据类型
geospatial 地理位置
可以干什么
朋友的定位、附近的人、打车距离计算
辅助查询经纬度测试数据:http://www.daquan.la/jingwei/
只有六个命令
官方文档:https://www.redis.net.cn/order/3685.html
- geoadd:添加一个(多个)地理位置
规则:两级无法直接添加,一般下载测试数据,java一次性导入
参数:key 值(经度(-180~180)、纬度(-85.05112878 ~ 85.05112878)、名称)
127.0.0.1:6379[6]> geoadd china:city 115.95 25.55 nanchang
(integer) 1
127.0.0.1:6379[6]> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379[6]> geoadd china:city 116.33 39.89 beijin
(integer) 1
127.0.0.1:6379[6]> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen
(integer) 2
127.0.0.1:6379[6]> geoadd china:city 120.16 30.24 hangzhou
(integer) 1
127.0.0.1:6379[6]>
- peopos:获取指定的一个(多个)经度和纬度
获得当前定位:一定是一个坐标值!
127.0.0.1:6379[6]> geopos china:city beijin chongqing
1) 1) "116.3299986720085144"
2) "39.89000061669732844"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
- geodist:两个城市之间距离(好友之间距离)
m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
127.0.0.1:6379[6]> geodist china:city beijin shanghai
"1069113.1187"
127.0.0.1:6379[6]> geodist china:city beijin shanghai km
"1069.1131"
127.0.0.1:6379[6]> geodist china:city beijin nanchang km
"1595.3768"
- georadius:以给定的经纬度为中心,找出某一半径内的元素(附近的人)
找附近的人?(获得附近的人地址,定位),通过半径查询
获得指定数量
所有数据都录入china:city,才会让结果更精确
#获取110 30经纬度为中心方圆1000km内的城市
127.0.0.1:6379[6]> georadius china:city 110 30 1000 km
1) "chongqing"
2) "shenzhen"
3) "nanchang"
4) "hangzhou"
127.0.0.1:6379[6]> georadius china:city 110 30 500 km
1) "chongqing"
#显示到中心距离的位置
127.0.0.1:6379[6]> georadius china:city 110 30 500 km withdist
1) 1) "chongqing"
2) "341.9374"
#显示他人的定位信息
127.0.0.1:6379[6]> georadius china:city 110 30 500 km withcoord
1) 1) "chongqing"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
#筛选出指定结果
127.0.0.1:6379[6]> georadius china:city 110 30 500 km withdist withcoord count 1
1) 1) "chongqing"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
- georadiusbymember:找出位于指定元素周围的其他元素
#位于 beijing 1000km的其他元素
127.0.0.1:6379[6]> georadiusbymember china:city beijin 1000 km
1) "beijin"
127.0.0.1:6379[6]> georadiusbymember china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
- geohash:返回一个(多个)位置元素的geohash表示
返回11个字符的geohash字符串!
两个字符串越接近,距离越近
127.0.0.1:6379[6]> geohash china:city beijin chongqing
1) "wx4dzjubj70"
2) "wm5xzrybty0"
- geo底层实现原理其实是Zset!
127.0.0.1:6379[6]> zrange china:city 0 -1
1) "chongqing"
2) "shenzhen"
3) "nanchang"
4) "hangzhou"
5) "shanghai"
6) "beijin"
127.0.0.1:6379[6]> zrem china:city beijin
(integer) 1
127.0.0.1:6379[6]> zrange china:city 0 -1
1) "chongqing"
2) "shenzhen"
3) "nanchang"
4) "hangzhou"
5) "shanghai"
Hyperloglog
什么是基数
A{1,3,5,7,9}
B{1,3,5,7,8}
基数(不重复的元素)=5,可以接受误差!
简介
Redis2.8.9版本就更新了Hyperloglog数据结构!
Redis Hyperloglog 基数传统的算法!
优点:占用内存是固定的,2^ 64不同的元素的技术!如果从内存角度比较的话Hyperloglog首选。
网页的uv(一个人访问一个网站多次,但是还是算作一个人!)
传统方式,set保存用户id,可以统计set中元素数量作为标准判断!
这个方式如果保存大量用户id,就比较麻烦!目的为了计数,而不是保存用户id;
0.91%错误率!传统的UV任务,可以忽略不计!
测试数据
127.0.0.1:6379> pfadd pfset a b c d e f g h j j i #创建第一组元素
(integer) 1
127.0.0.1:6379> pfcount pfset #统计第一组元素基数数量
(integer) 10
127.0.0.1:6379> pfadd pfkey a s s s d s r d #创建第二组
(integer) 1
127.0.0.1:6379> pfcount pfkey
(integer) 4
127.0.0.1:6379> pfmerge pf pfset pfkey #合并两组
OK
127.0.0.1:6379> pfcount pf #查看并集数量
(integer) 12
如果允许容错,一定可以使用!
不允许就用自己的数据类型!
Bitmaps
位存储:
两个状态的,都可以用:同城感染人数、统计用户信息(活跃、不活跃)、登录,未登录、打卡!
测试数据
使用Bitmaps来记录周一到周日的打卡:
127.0.0.1:6379[8]> setbit sign 0 1
(integer) 0
127.0.0.1:6379[8]> setbit sign 1 0
(integer) 0
127.0.0.1:6379[8]> setbit sign 2 1
(integer) 0
127.0.0.1:6379[8]> setbit sign 3 1
(integer) 0
127.0.0.1:6379[8]> setbit sign 4 0
(integer) 0
127.0.0.1:6379[8]> setbit sign 5 0
(integer) 0
127.0.0.1:6379[8]> setbit sign 6 0
(integer) 0
查看某一天是否有打卡:
127.0.0.1:6379[8]> getbit sign 4
(integer) 0
127.0.0.1:6379[8]> getbit sign 3
(integer) 1
统计操作,统计打卡天数:
127.0.0.1:6379[8]> bitcount sign
(integer) 3