geospatial(地理位置)
朋友的定位,附近的人,打车距离计算
redis的Geo在redis3.2版本推出了,这个功能可以推算地理位置信息,两地之间的距离,方圆几里的人。
可以查询一些测试数据
只有6个命令
官方文档: https://www.redis.net.cn/order/3685.html
geoadd
# geoadd 添加地理位置
# 规则:2极无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入
# 有效经度从-180到180度
# 有效的维度从-85.05112878度到85.05112878度
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(error) ERR invalid longitude,latitude pair 39.900000,116.40000
参数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 chongqin 114.05 22.52 shengzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
127.0.0.1:6379>
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 beijing chongqin
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
127.0.0.1:6379>
geodist
两人之间的距离
单位:
- m 表示单位为米
- km 表示单位为千米
- mi 表示单位为英里
- ft 表示单位为英尺
127.0.0.1:6379> geodist china:city beijing chongqin km查看北京到重庆的直线距离
"1464.0708"
127.0.0.1:6379> geodist china:city beijing shanghai km查看北京到上海的直线距离
"1067.3788"
127.0.0.1:6379>
georadius 以给定的经纬度为中心,找出某一半径内的元素
我附近的人(获取所有附近人的地址,定位)通过半径来查询
获得指定数量的人,200
所有数据应该都录入:china:city,才会让结果更加清晰
127.0.0.1:6379> georadius china:city 110 30 1000 km 以110,30这个经纬度为中心,寻找方圆1000km内的城市
1) "chongqin"
2) "xian"
3) "shengzhen"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqin"
2) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist显示到中间距离的位置
1) 1) "chongqin"
2) "341.9374"
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.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) "chongqin"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 2
1) 1) "chongqin"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
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"
127.0.0.1:6379>
geohash 命令 返回一个或多个位置元素 的geohash表示
该命令将返回11个字符的geohash字符串
# 将二维的经纬度转换为一维字符串,如果2个字符串越接近,那么则距离越近
127.0.0.1:6379> geohash china:city beijing chongqin
1) "wx4fbxxfke0"
2) "wm5xzrybty0"
127.0.0.1:6379>
GEO底层的实现原理其实就是Zset,我们可以使用Zset命令来操作geo
127.0.0.1:6379> zrange china:city 0 -1 查看地图中全部元素
1) "chongqin"
2) "xian"
3) "shengzhen"
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) "shengzhen"
4) "hangzhou"
5) "shanghai"
127.0.0.1:6379>
Hyperloglog
什么是基数?
A {1,3,5,7,8,7}
B{1,3,5,7,8}
基数(不重复的元素)= 5 ,可以接受误差
简介
redis2.8.9版本就更新了Hyperloglog数据结构
Redis Hyperloglog基数统计的算法
优点:占用内存是固定的,2^64不同的元素的基数,只需要12KB的内存,如果要从内存的角度来比较的话Hyperloglog首选
网页的UV(页面访问量),一个人访问一个网站多次,但是还是算作一个人
传统的方式,set保护用户的id,然后就可以统计set中的元素数量作为标准判断
这个方式如果保存大量的用户id,就会比较麻烦,我们的目的是为了计数,而不是保存用户id
0.81%错误率,统计UV任务,可以忽略不计的
127.0.0.1:6379> pfadd mykey1 a b c d e f g h i j 创建第一组元素mykey1
(integer) 1
127.0.0.1:6379> pfcount mykey1 统计mykey元素的基数数量
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j k l v c b e o p 创建第二组元素mykey2
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 10
127.0.0.1:6379> pfmerge mykey3 mykey1 mykey2合并两组mykey1 mykey2 ----> mykey3 并集
OK
127.0.0.1:6379> pfcount mykey3 看并集的数量
(integer) 15
如果可以允许容错,那么一定可以使用Hyperloglog
如果不允许容错,就使用set或者自己的数据类型即可
Bitmap
位存储
统计用户信息,活跃,不活跃,登录,未登录,打卡,365天打卡,2个状态,都可以使用Bitmaps
Bitmap位图,数据结构,都是操作二进制来进行记录的,就只有0和1两个状态
365天=365bit 1字节=8bit 46个字节左右
使用bitmap来记录周一到周日的打卡
周一:1 周二:0 周三:1 周四:1 ……
查看某一天是否打卡
统计操作,统计打卡天数