geospatial(地理空间)
- 可以实现朋友的定位,附近的人,打车距离计算
- Redis的Geo在Redis3.2版本就推出了,这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人
- 测试数据查询:https://jingweidu.51240.com/
-
只有6个命令
GEOADD 添加地理位置
# 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入
# 有效经度:-180到180
# 有效纬度:-85.05112878到85.05112878
# 参数: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.54 29.40 chongqing
(integer) 1
127.0.0.1:6379> GEOADD china:city 114.05 22.52 shengzhen
(integer) 1
127.0.0.1:6379> GEOADD china:city 120.21 30.20 hangzhou 108.96 34.26 xian
(integer) 2
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 shanghai
1) 1) "121.47000163793563843"
2) "31.22999903975783553"
127.0.0.1:6379> GEOPOS china:city hangzhou
1) 1) "120.21000176668167114"
2) "30.19999988833350102"
GEODIST
两人之间的距离
单位:
- m 表示单位米
- km 表示单位千米
- mi 表示单位英里
- ft 表示单位英尺
127.0.0.1:6379> GEODIST china:city beijing chongqing km # 查看北京到重庆的直线距离
"1473.6565"
127.0.0.1:6379> GEODIST china:city beijing hangzhou km # 查看北京到杭州的直线距离
"1132.9792"
GEORADIUS 以给定的经纬度为中心,找出某一半径内的元素
附近的人(获得所有附近的人的地址,定位)通过半径来查询
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km # 以100,30这个经纬度为中心,寻找方圆1000km内的城市
1) "chongqing"
2) "xian"
3) "shengzhen"
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) "340.8679"
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.54000014066696167"
2) "29.39999880018641676"
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) "340.8679"
3) 1) "106.54000014066696167"
2) "29.39999880018641676"
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 1000 km
1) "hangzhou"
2) "shanghai"
GEOHASH 返回一个或多个位置的 GEOHASH表示
# 将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越接近
127.0.0.1:6379> geohash china:city beijing chongqing
1) "wx4fbxxfke0"
2) "wm5z22h53v0"
GEO 底层的实现原理其实就是Zset,我们可以使用Zset命令来操作GEO
127.0.0.1:6379> ZRANGE china:city 0 -1 # 查看地图中全部的元素
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city chongqing # 移除指定元素
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "xian"
2) "shengzhen"
3) "hangzhou"
4) "shanghai"
5) "beijing"
Hyperloglog
Redis2.8.9版本更新了Hyperloglog 数据结构
Redis Hyperloglog 基数统计的算法
优点:占用的内存是固定的,2^64 不同的元素的技术,只需要12kb内存。
网页的UV (一个人访问一个网站多次,但是还是算一个人)
127.0.0.1:6379> pfadd mykey a b c d e f g i h j # 创建第一组元素 mykey
(integer) 1
127.0.0.1:6379> pfcount mykey # 统计 mykey 元素的基数数量
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j g m n q w h
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 8
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2 # 合并两组mykey,mykey2 ==> mykey3 并集
OK
127.0.0.1:6379> pfcount mykey3
(integer) 14
Bitmap
位存储
两个状态的都可以使用bitmap,非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> bitcount sign # 统计这周打卡记录
(integer) 3