朋友的定位,附近的人,位置共享
redis的geo 在3.2就已经推出了!两地之间的距离,方圆几里的人!都可以用它实现
这个需要把你所在地的经纬度输进去,所以我们随便找个网站:http://www.jsons.cn/lngcode/进行查询即可!
只有六个命令!
官方文档:https://www.redis.net.cn/order/3685.html
geoadd 添加地理位置
有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。
# 添加地理位置
# 规则:两极无法直接添加,一般会下载城市数据包,直接通过Java程序导入!
# 参数 key 值(纬度,经度,名称)
127.0.0.1:6379> geoadd china:city 121.472644 31.231706 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 116.405285 39.904989 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 108.948024 34.263161 xian
(integer) 1
127.0.0.1:6379> geoadd china:city 106.504962 29.533155 chongqing 120.153576 30.287459 hangzhou
(integer) 2
127.0.0.1:6379> geoadd china:city 114.085947 22.547 shenzhen
(integer) 1
geopos
获得当前定位:一定是一个坐标值!
127.0.0.1:6379> GEOPOS china:city beijing #获取指定城市的经度和纬度
1) 1) "116.40528291463851929"
2) "39.9049884229125027"
127.0.0.1:6379> GEOPOS china:city beijing xian
1) 1) "116.40528291463851929"
2) "39.9049884229125027"
2) 1) "108.94802302122116089"
2) "34.2631604414749944"
geodist
位置共享,返回两个人之间的距离(绝对路径)
指定单位的参数 unit 必须是以下单位的其中一个:
127.0.0.1:6379> geodist china:city beijing shenzhen
"1943024.0448"
127.0.0.1:6379> geodist china:city beijing shenzhen km #查看北京到深圳的直线距离 单位km
"1943.0240"
georadius
以给定的经纬度为中心,找出某一半径内的元素
附近的人?(获得所有附近的人的位置信息,打开定位!) 通过半径来查询!
获得指定数量的人!前提:所有的数据得在这个集合里面
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km #以110 30 为中心,获取方圆1000km内的城市
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 1000 km withdist withcoord count 1 #显示直线距离 和 坐标 只显示一个
1) 1) "chongqing"
2) "341.4052"
3) 1) "106.50495976209640503"
2) "29.53315530684997015"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist withcoord count 2
1) 1) "chongqing"
2) "341.4052"
3) 1) "106.50495976209640503"
2) "29.53315530684997015"
2) 1) "xian"
2) "484.4073"
3) 1) "108.94802302122116089"
2) "34.2631604414749944"
georadiusbymember
找出指定元素周围的其他元素,用于导航!
127.0.0.1:6379> GEORADIUSBYMEMBER china:city xian 1000 km #查询西安周围1000km内的城市
1) "xian"
2) "chongqing"
3) "beijing"
GEOHASH
该命令将返回11个字符的Geohash字符串~
#将二维的经纬度转化为一维的字符串
127.0.0.1:6379> GEOHASH chaina:city beijing xian
1) "wx4g0b7xrt0"
2) "wqj6zjmt2u0"
geo的底层其实就是zset ,所以我们可以用zset的命令去操纵它
例如:移除一个城市
127.0.0.1:6379> ZRANGE chaina:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "beijing"
127.0.0.1:6379> zrem chaina:city hangzhou
(integer) 1
127.0.0.1:6379> ZRANGE chaina:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "beijing"
什么是基数?
A{1,3,6,7,5,6}
B{1,3,5,7,6}
两个的基数都(不重复的元素)=5,可以接受误差!
简介
redis 2.8.9版本就更新了Hyperloglog数据结构!
Hyperloglog:基数统计算法!0.81%的错误率,不过统计大量数据可以忽略!
优点:占用的内存是固定的,统计2^64这么大的基数,只占用12kb的内存,就很方便!
网页的uv统计(一个人访问多次网站,也算一个人)
传统的方式是用set集合把每个人的id保存下来,然后统计元素数量,但是这个太费
内存了,而且我们的目标是统计数量,现在还要浪费大量的空间,就很不划算!
测试使用
127.0.0.1:6379> pfadd key a b c #添加一点元素
(integer) 1
127.0.0.1:6379> PFCOUNT key #统计基数
(integer) 3
127.0.0.1:6379> PFADD key2 b c d
(integer) 1
127.0.0.1:6379> PFCOUNT key2
(integer) 3
127.0.0.1:6379> PFCOUNT key key2 #可以这样统计两组中的基数
(integer) 4
127.0.0.1:6379> PFMERGE key3 key key2 #或者先把这两个组导入到一个组中再进行统计
OK
127.0.0.1:6379> PFCOUNT key3
(integer) 4
127.0.0.1:6379> pfadd key5 a a b
(integer) 1
127.0.0.1:6379> PFCOUNT key5
(integer) 2
位存储
登录/未登录 活跃/不活跃 打卡
两个状态的都可以使用它!
Bitmap 位图:数据结构,都是操作二进制位来进行记录,只有0和1两种状态!
测试
比如记录一周的打卡情况!
周一:0没打卡,周二:1已打卡……
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 1
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0
127.0.0.1:6379> setbit sign 7 1
(integer) 0
查看某一天的打卡情况
127.0.0.1:6379> getbit sign 1
(integer) 0
127.0.0.1:6379> getbit sign 5
(integer) 1
统计打卡的天数
127.0.0.1:6379> BITCOUNT sign
(integer) 5