概述
geospatial地理位置
朋友的定位,附近的人,打车距离计算?
Redis的Geo在Redis3.2版本就推出了,这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人
可以查询一些测试数据
6个命令
GEOADD
#getadd添加地理位置
#规则:两极无法直接添加,一般会下载城市数据,直接通过java程序一次性导入!
#参数,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 106.50 29.53 chongqing 114.05 22.52 shenzhen
(integer) 2
127.0.0.1:6379> GEOADD china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
getpos
获得当前的定位:一定是一个坐标值
经度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 chongqing
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "106.49999767541885376"
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 #查看北京到上海的距离,单位:km
"1067.3788"
127.0.0.1:6379> GEODIST china:city beijing chongqing km
"1464.0708"
GEORADIUS :以给定的经纬度为中心,找出某一半径内的元素
附近的人,获取所有人的地址,定位!通过半径来查询
获得指定数量的人,200
所有的数据都录入:china:city
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km #以 110 30 这个经纬度为中心寻找方圆100km里内的城市
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "chongqing"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist
#显示到中心距离的位置
1) 1) "chongqing"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord #显示他人的定位信息
1) 1) "chongqing"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379> 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命令—找出位于指定范围内的元素,中心点是由给定的位置元素决定
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
Redis GEOHASH命令 — 返回一个或多个位置元素的Geohash表示
该命令将返回11个字符的Geohash字符串
#将二维的经纬度转换为一维的字符串,如果两个字符串越接近,距离越近
127.0.0.1:6379> GEOHASH china:city beijing chongqing
1) "wx4fbxxfke0"
2) "wm5xzrybty0"
GEO底层的实现原理其实就是zset,可以使用zest命令操作geo
127.0.0.1:6379> ZRANGE china:city 0 -1 #查看地图中全部的元素
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city beijing #移除指定元素
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
Hyperloglog
什么是基数
A{1,3,5,7,9,7}
B{1,3,5,7,8}
基数(不重复的元素)=5,可以接受误差!
简介
Redis Hyperloglog基数统计的算法!
优点:占用的内存是固定的,2^64不同的元素的计数,只要废12KB内存!如果要从内存角度来比较的话Hyperloglog首选。
网页的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 #统计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 #将mykey与mykey2进行合并,成为mykey3,此时是一个并集
OK
127.0.0.1:6379> PFCOUNT mykey3
(integer) 15
如果允许容错,一定可以使用Hyperloglog
如果不允许容错,就是用set或者自己的数据类型即可
Bitmap
位存储
统计用户信息,活跃,不活跃!登录,未登录!打卡,365打卡!两个状态的,都可以使用Bitmap!
Bitmap位图,数据结构!都是操作二进制为来进行记录,就只有0和1两个状态!
365天 = 365bit
测试
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 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
使用bitmap来记录周一到周日的打卡!
查看某一天是否有打卡!
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 6
(integer) 0
统计操作,统计打卡的天数
127.0.0.1:6379> BITCOUNT sign #统计这周的打卡记录
(integer) 3
最后
以上就是暴躁老师为你收集整理的Redis三种特殊数据类型的全部内容,希望文章能够帮你解决Redis三种特殊数据类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复