三种特殊数据类型
Geospatial地理位置
朋友的定位、附近的人、打车距离计算
Redis的Geo在Redis3.2版本就退出了,这个功能可以推算地理位置信息,两地直接的距离,方圆几里的人
只有六个命令
geoadd
# geoadd 添加具体位置
# 规则:两极无法直接添加,一般都是程序一次性导入
# 参数 key 值(维度、经度、名称)
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 160.50 29.53 chongqin 114.05 22.54 shenzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
127.0.0.1:6379> geoadd china:city 39.90 116.40 beijin
(error) ERR invalid longitude,latitude pair 39.900000,116.400000
geopos
获取当前定位:一定是一个坐标值
127.0.0.1:6379> geopos china:city beijing # 获取指定的精度和维度
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city beijing chongqin
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "160.49999982118606567"
2) "29.52999957900659211"
geodist
两人之间的距离
127.0.0.1:6379> geodist china:city beijing shanghai
"1067378.7564"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"
127.0.0.1:6379> geodist china:city beijing shanghai m
"1067378.7564"
georadius
我附近的人?(获取所有附近的人的地址、定位)通过半径来查询
获取指定数量的人
#以110 30这个经纬度为中心,寻找方圆1000km的城市,显示中心距离的位置、城市经纬度、筛选出指定的结果
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist withcoord count 3
1) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
2) 1) "shenzhen"
2) "922.6257"
3) 1) "114.04999762773513794"
2) "22.53999903789756587"
3) 1) "hangzhou"
2) "977.5143"
3) 1) "120.1600000262260437"
2) "30.2400003229490224"
georadiusbymember
# 找出指定元素周围的其他元素
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"
geohash
返回11个字符的geohash字符串
# 将二位的经纬度转化成字符串,字符串越接近,距离越近
127.0.0.1:6379> GEOHASH china:city beijing chongqin
1) "wx4fbxxfke0"
2) "xt4purb89n0"
GEO底层实现原理就是Zset,所以可以使用Zset命令操作GEO
127.0.0.1:6379> ZRANge china:city 0 -1 # 查看全部城市
1) "xian"
2) "shenzhen"
3) "hangzhou"
4) "shanghai"
5) "beijing"
6) "chongqin"
127.0.0.1:6379> zrem china:city beijing # 移除北京
(integer) 1
127.0.0.1:6379> ZRANge china:city 0 -1
1) "xian"
2) "shenzhen"
3) "hangzhou"
4) "shanghai"
5) "chongqin"
Hyperloglog基数统计
什么是基数?就是不重复的元素
A{1,3,5,7,8,9,7}
B{1,3,5,7,8}
基数 = 5,可以接受误差
简介
Redis Hyperloglog基数统计的算法
优点:占用的内存是固定,2^64不同的元素的技术,只需要12kb内存
网页的UV(一个人访问一个网站多次,但还是算作一个人)
传统方式:set保存用户的id,然后就可以统计set中的元素数量作为标准判断
这个方式如果保存大量的用户id,就会比较麻烦,占用内存太大!我们的目的是为了计数,而不是保存用户id
0.81%错误率,统计UV可以忽略不计
127.0.0.1:6379> PFadd mykey a b c d e f g h i j # 创建第一组元素 mykey
(integer) 1
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 # 创建第二组元素 mykey2
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 9
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 # 合并两组 mykey mykey2 到 mykey3
OK
127.0.0.1:6379> pfcount mykey3 # 查看并集数量
(integer) 15
如果允许容错,一定可以使用Hyperloglog
如果不允许容错,就使用set或者自己的数据类型
Bitmap位图场景
位存储
统计用户信息,活跃,不活跃!登录、未登录!打卡,365打卡!两个状态的都可以使用Bitmap
Bitmap位图也是一种数据结构,都是操作二进制位进行记录,只有0和1两个状态
365天=365bit 1字节 = 8bit 约64字节
使用bitmap来记录 周一到周日的打卡
周一:1 周二:0 周三:0 周四:1 ……
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 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
127.0.0.1:6379> getbit sign 4 # 查看一天的情况
(integer) 1
127.0.0.1:6379> getbit sign 6
(integer) 0
127.0.0.1:6379> bitcount sign # 统计全周的打开记录
(integer) 3