三种特殊数据类型
1. geospatial
1. 概述
朋友的定位,附近的人,打车距离实现
Redis 的 Geo 在 Redis 3.2 版本就推出了! 这个功能可以推算地理位置的信息: 两地之间的距离,方圆几里的人
所有的geospatial命令都是geo开头的
2. 相关命令
1. geoadd
添加地理位置
127.0.0.1:6379> geoadd china:city 118.76 32.04 manjing 112.55 37.86 taiyuan 123.43 41.80 shenyang
(integer) 3
127.0.0.1:6379> geoadd china:city 144.05 22.52 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3
规则
2. geopos
获取指定的成员的经度和纬度
127.0.0.1:6379> geopos china:city taiyuan manjing
1) 1) "112.54999905824661255"
2) "37.86000073876942196"
2) 1) "118.75999957323074341"
2) "32.03999960287850968"
获得当前定位,一定是一个坐标值!
3. geodist
如果不存在,返回空
单位如下
- m
- km
- mi 英里
- ft 英尺
127.0.0.1:6379> geodist china:city taiyuan shenyang m
"1026439.1070"
127.0.0.1:6379> geodist china:city taiyuan shenyang km
"1026.4391"
4. georadius
附近的人 ==> 获得所有附近的人的地址,定位,通过半径来查询
获得指定数量的人
127.0.0.1:6379> georadius china:city 110 30 1000 km 以 100,30 这个坐标为中心,寻找半径为1000km的城市
1) "xian"
2) "hangzhou"
3) "manjing"
4) "taiyuan"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "xian"
2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist count 2
1) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
2) 1) "manjing"
2) "864.9816"
3) 1) "118.75999957323074341"
2) "32.03999960287850968"
参数 key 经度 纬度 半径 单位 [显示结果的经度和纬度] [显示结果的距离] [显示的结果的数量]
5. georadiusbymember
显示与指定成员一定半径范围内的其他成员
127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km
1) "manjing"
2) "taiyuan"
3) "xian"
127.0.0.1:6379> georadiusbymember china:city taiyuan 1000 km withcoord withdist count 2
1) 1) "taiyuan"
2) "0.0000"
3) 1) "112.54999905824661255"
2) "37.86000073876942196"
2) 1) "xian"
2) "514.2264"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
参数与 georadius 一样
6. geohash(较少使用)
该命令返回11个字符的hash字符串
127.0.0.1:6379> geohash china:city taiyuan shenyang
1) "ww8p3hhqmp0"
2) "wxrvb9qyxk0"
将二维的经纬度转换为一维的字符串,如果两个字符串越接近,则距离越近
3. 底层
geo底层的实现原理实际上就是Zset,我们可以通过Zset命令来操作geo
127.0.0.1:6379> type china:city
zset
查看全部元素 删除指定的元素
127.0.0.1:6379> zrange china:city 0 -1 withscores
1) "xian"
2) "4040115445396757"
3) "hangzhou"
4) "4054133997236782"
5) "manjing"
6) "4066006694128997"
7) "taiyuan"
8) "4068216047500484"
9) "shenyang"
10) "4072519231994779"
11) "shengzhen"
12) "4154606886655324"
127.0.0.1:6379> zrem china:city manjing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "xian"
2) "hangzhou"
3) "taiyuan"
4) "shenyang"
5) "shengzhen"
2. hyperloglog
基数 ---- 不重复的元素,可以接受误差
1. 简介
-
Redis 2.8.9 版本就更新了 Hyperloglog 数据结构!
-
Hyperloglog是基数统计的算法
-
用于统计网页的 UV (一个人访问一个网站多册,但是还是算作一个人)
-
优点
-
命令都是pf开头的
-
如果不允许容错,就使用 set 或者自己的数据类型即可
2.测试使用
127.0.0.1:6379> pfadd mykey a b c d e f g h i j
(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
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 9
127.0.0.1:6379> pfmerge mykey3 mykey mykey2
OK
127.0.0.1:6379> pfcount mykey3
(integer) 15
3. bitmaps
1. 简介
位存储,one hot编码
统计用户信息,活跃,不活跃! 登录,未登录! 打卡,365打卡!
只有两个状态的,都可以使用bitmaps!
Bitmaps 位图,数据结构,都是操作二进制位来进行记录,只有 0 和 1 两个状态
例如 : 365 天 = 365 bit 1字节 = 8 bit ==> 只需要 46 个字节左右就可以存储用户的一年打卡的信息了!
2. 测试
使用bitmap来记录周一至周日的打卡
周一: 1 周二: 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 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
- setbit key offset value
- value只能为0 和 1
- offset从0开始
查看某一天是否有打卡 getbit key value
127.0.0.1:6379> getbit sign 5
(integer) 1
同级操作,统计打卡的天数( 1的个数 ) bitcount key
127.0.0.1:6379> bitcount sign
(integer) 4