Redis的Geo在Redis3.2版本就推出了!这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人
精度维度查询工具:网站
相关命令
1、getadd
:添加地理位置
将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
。这些数据将会存储到sorted set
这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作
。
该命令以采用标准格式的参数x,y,所以经度必须在纬度之前
。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001
规定如下:
经度
从``-180度到180度`。纬度
从-85.05112878度到85.05112878度
。key(精度 纬度)
规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!!!
1.1、设置值
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.56 29.53 chongqin
(integer) 1
127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzheng 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 3
127.0.0.1:6379>
1.2、获取指定城市的精度和纬度
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) "106.55999869108200073"
2) "29.52999957900659211"
127.0.0.1:6379>
2、geodist
:返回两个给定位置之间的距离
单位
m
表示单位为米km
表示单位为千米mi
表示单位为英里ft
表示单位为英尺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>
3、georadius
:以给定的经纬度为中心, 找出某一半径内的元素
前提:所有数据都应录入,才会让结果更加清晰
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km # 以110,30 这个经纬度为中心,寻找方圆500km内的城市
1) "chongqin"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 5000 km # 显示到110,30距离的位置
1) "chongqin"
2) "xian"
3) "shenzheng"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist # 显示他人的定位信息
1) 1) "chongqin"
2) "336.2141"
2) 1) "xian"
2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord # 帅选出指定的结果
1) 1) "chongqin"
2) 1) "106.55999869108200073"
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) "chongqin"
2) "336.2141"
3) 1) "106.55999869108200073"
2) "29.52999957900659211"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2 # 帅选出指定的结果
1) 1) "chongqin"
2) "336.2141"
3) 1) "106.55999869108200073"
2) "29.52999957900659211"
2) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379>
4、georadiusbymember
:找出位于指定范围内的元素,中心点是由给定的位置元素决定
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km # 找出距离北京1000km的城市
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
127.0.0.1:6379>
5、geohash
:返回一个或多个位置元素的 Geohash 表示(了解即可)
该命令将返回11个字符的Geohash字符串
# 将二维的经纬度转换成一维的字符串,如果两个字符串越接近,那么距离越近
127.0.0.1:6379> geohash china:city beijing
1) "wx4fbxxfke0"
127.0.0.1:6379> geohash china:city beijing chongqin
1) "wx4fbxxfke0"
2) "wm5zbzf8ey0"
127.0.0.1:6379>
GEO底层的实现原理其实就是Zset !我们可以使用Zset命令来操作geo
127.0.0.1:6379> ZRANGE china:city 0 -1 # 查看地图中全部的元素
1) "chongqin"
2) "xian"
3) "shenzheng"
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) "chongqin"
2) "xian"
3) "shenzheng"
4) "hangzhou"
5) "shanghai"
127.0.0.1:6379>
先介绍一下什么是基数:不重复的元素
Redis 2.8.9版本就更新了Hyperloglog
数据结构!
优点∶占用的内存是固定,2^64不同的元素的技术,只需要废12KB内存!如果要从内存角度来比较的话Hyperloglog
首选
测试使用
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 # 统计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 # 合并两组 mykey mykey2 ==> mykey3
127.0.0.1:6379> PFCOUNT mykey3
(integer) 15
127.0.0.1:6379>
Hyperloglog
位存储
Bitmaps
位图,数据结构,都是操作二进制位来进行记录,就只有0和1两个状态
使用Bitmap
来记录周一到周日的打卡,1
是打卡,0
是没有打卡
127.0.0.1:6379> getbit sign 6
(integer) 0
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379>
统计操作,统计打卡的天数
127.0.0.1:6379> bitcount sign # 统计这周的打卡记录,就可以看到是否有全勤
(integer) 3
127.0.0.1:6379>
学习视频:走你