redis三种特殊的数据类型
1 GEOSPATIAL地理位置
使用经纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用
- 有效的经度从-180度到180度。
- 有效的纬度从-85.05112878度到85.05112878度。
只有6个命令
image.png
1.1geoadd 添加地理位置
处理一个报错信息
127.0.0.1:6379[1]> geoadd china 39.290000 116.400000 "beijin"
(error) ERR invalid longitude,latitude pair 39.290000,116.400000
这是因为效的纬度从-85.05112878度到85.05112878度
添加经纬度一般情况都是用程序导入自动添加的
127.0.0.1:6379[1]> geoadd china:city 39.290000 16.400000 "beijin"
(integer) 1
127.0.0.1:6379[1]> geoadd china:city 24.290000 10.400000 "shanghai" #添加城市的经度和纬度
(integer) 1
127.0.0.1:6379[1]> geoadd china:city 123.290000 40.400000 "nanjin"
(integer) 1
127.0.0.1:6379[1]> geoadd china:city 33.290000 50.400000 "hangzhou" 24.45 43.44 "kunmin"
(integer) 2
1.2geopos获取地理位置
获得当前定位,一定是一个坐标值
127.0.0.1:6379[1]> geopos china:city shanghai #获取指定城市的精度和纬度
1) 1) "24.29000169038772583"
2) "10.400000204945691"
127.0.0.1:6379[1]> geopos china:city beijin
1) 1) "39.28999811410903931"
2) "16.39999949452474226"
1.3geodist返回给定两个位置之间的距离
返回两个给定位置之间的距离。
如果两个位置之间的其中一个不存在, 那么命令返回空值。
指定单位的参数 unit 必须是以下单位的其中一个:
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
127.0.0.1:6379[1]> geodist china:city shanghai beijin #查看上海到北京的直线距离 单位默认是m(米)
"1753788.6161"
127.0.0.1:6379[1]> geodist china:city shanghai beijin KM #查看距离,将单位设置为KM(千米)
"1753.7886"
1.4georadius 以给定的经纬度为中心,找出某一半径内的元素
georadius 组别 当前经度 当前纬度 范围 单位
withdist 知道详细的直线距离
withcoord 知道详细经纬度
127.0.0.1:6379[1]> georadius china:city 30.00 15.00 100 KM #通过当前坐标查找附近100千米的人
(empty array)
127.0.0.1:6379[1]> georadius china:city 30.00 15.00 1000 KM
1) "shanghai"
127.0.0.1:6379[1]> georadius china:city 30.00 15.00 10000 KM
1) "shanghai"
2) "beijin"
3) "kunmin"
4) "hangzhou"
5) "nanjin"
####添加了withdist不仅可以知道城市名,还可以知道详细的直线距离
127.0.0.1:6379[1]> georadius china:city 30.00 15.00 10000 KM withdist
1) 1) "shanghai"
2) "803.3572"
2) 1) "beijin"
2) "1006.7467"
3) 1) "kunmin"
2) "3206.9954"
4) 1) "hangzhou"
2) "3948.5609"
5) 1) "nanjin"
####知道详细经纬度
127.0.0.1:6379[1]> georadius china:city 30.00 15.00 10000 KM withcoord
1) 1) "shanghai"
2) 1) "24.29000169038772583"
2) "10.400000204945691"
2) 1) "beijin"
2) 1) "39.28999811410903931"
2) "16.39999949452474226"
3) 1) "kunmin"
2) 1) "24.4500008225440979"
2) "43.4399992669671775"
4) 1) "hangzhou"
2) 1) "33.28999847173690796"
2) "50.39999884843426514"
5) 1) "nanjin"
2) 1) "123.28999847173690796"
2) "40.39999918756212338"
####限制查询数量
127.0.0.1:6379[1]> georadius china:city 30.00 15.00 10000 KM withcoord withdist count 2
1) 1) "shanghai"
2) "803.3572"
3) 1) "24.29000169038772583"
2) "10.400000204945691"
2) 1) "beijin"
2) "1006.7467"
3) 1) "39.28999811410903931"
2) "16.39999949452474226"
1.5 GEORADIUSBYMEMBER找出位于指定范围内的元素,中心点是由给定的位置元素决定的
127.0.0.1:6379[1]> GEORADIUSBYMEMBER china:city shanghai 1000 km #通过指定城市查找周边范围内的其他城市
1) "shanghai"
127.0.0.1:6379[1]> GEORADIUSBYMEMBER china:city shanghai 10000 km
1) "shanghai"
2) "beijin"
3) "kunmin"
4) "hangzhou"
1.6GEOHASH 命令
该命令返回11个字符长度的geohash字符串!
#返回的是两个城市的经纬度,但是会将二维的经纬度转化为一维的字符串
#如果两个字符串越接近,那么两个地理位置越近
127.0.0.1:6379[1]> geohash china:city beijin shanghai
1) "sfgvq1d0gm0" #北京的经纬度转化为字符串
2) "s9c70tr2qh0" #上海的经纬度转化为字符串
1.7geo的底层实现原理其实是zset,那么就意味着我们可以用zset的命令来操作它
127.0.0.1:6379[1]> zrange china:city 0 -1 #zset的查询命令来操作
1) "shanghai"
2) "beijin"
3) "kunmin"
4) "hangzhou"
127.0.0.1:6379[1]> zrem china:city shanghai #zset的删除命令
(integer) 1
127.0.0.1:6379[1]> zrange china:city 0 -1
1) "beijin"
2) "kunmin"
3) "hangzhou"
2 HyperLogLog
什么是基数?
A{1,2,4,6,7}
B{2,4,5,6,8}
基数(不重复的元素) = 4 ,可以接受误差
HyperLogLog简介
redis的HyperLogLog是用来做基数统计的算法!
优点:占用的内存是固定的,2^64的数据只需要占用12KB的内存,从内存角度来比较的话HyperLogLog是首选。
网页的UV -访问人数(一个人访问多次网站,但访问量还是只算一个人)
传统的方式:用set保存用户的uid,然后就可以通过统计set中的元素数量作为标准判断!
但是这个方式会保存大量的用户ID,假如是分布式ID,并且人数众多,那么我们的内存占用就比较大!我们的目的是为了计数,而不是保存用户ID
这个时候就可以用HyperLogLog
,它虽然有0.81%
的错误率,但是这个误差是可以忽略的。
所有的HyperLogLog命令是以P开头的
命令
pfadd添加一个set集合
pfcount输出这个集合中不重复的元素的数量
PFMERGE合并两个集合到另外的一个集合中
127.0.0.1:6379[1]> pfadd mykey a b c d #新建一个集合
(integer) 1
127.0.0.1:6379[1]> pfadd mykey1 c d e f
(integer) 1
127.0.0.1:6379[1]> pfcount mykey #输出这个集合中不重复的元素的数量
(integer) 4
127.0.0.1:6379[1]> pfcount mykey mykey1 #输出两个集合中不重复元素的数量
(integer) 6
127.0.0.1:6379[1]> PFMERGE mykey3 mykey mykey1 #合并两个集合到另外的一个集合中 (并集)
OK
127.0.0.1:6379[1]> pfcount mykey3
(integer) 6
3Bitmaps位图
用来统计用户信息,活跃不活跃!登录未登录!等等这些状态!只要是只有两个状态的,都可以使用Bitmaps!
Bitmaps位图,是一种数据结构!只有0和1两种状态!!
例如:存某个人365天的状态 :365天=365bit 1字节=8bit 46个字节就可以存完!
image.png测试:用Bitmpas来存储用户每周是否打卡
0代表没有打卡,1代表打卡
127.0.0.1:6379[1]> setbit sign 1 0
(integer) 0
127.0.0.1:6379[1]> setbit sign 2 0
(integer) 0
127.0.0.1:6379[1]> setbit sign 3 1
(integer) 0
127.0.0.1:6379[1]> setbit sign 4 1
(integer) 0
查看用户某一天是否打过卡
127.0.0.1:6379[1]> getbit sign 2
(integer) 0
127.0.0.1:6379[1]> getbit sign 3
(integer) 1
统计打卡的天数
127.0.0.1:6379[1]> bitcount sign
(integer) 2
网友评论