目录
GEORADIUS:以给定的经纬度为中心,找出某一半径内的元素
GEORADIUSBYMEMBER:找出位于指定范围内的元素,中心点是由给定的位置元素决定
GEO底层的实现原理其实就是Zset !我们可以使用Zset命令来操作geo !
Geospatial:地理位置
Hyperloglog:基数统计的算法
Bitmaps:位图(位存储)
如我需要查询朋友的定位,附近的人,打车所需距离的计算?
这个功能可以推算地理位置的信息,比如说两地之间的距离,方圆几里之内的人
可以查询一些测试数据:全国城市经纬度查询-知之小工具 (100xgj.com)
#规则:两极是无法直接添加的,我们一般会下载城市数据,直接通过java或者python程序导入!
- 按照(经度 纬度 名称)填写哦!!
- 如果写错了,可以通过flushdb刷新redis数据库,并通过clear清理页面
-
- 127.0.0.1:6379> GEOADD china:city 39.54 116.28 Beijin
- (error) ERR invalid longitude,latitude pair 39.540000,116.280000
- 如果出现了如上错误,说明我们写的经纬度超出范围了
-
-
- 127.0.0.1:6379> AUTH 123456
- OK
- 127.0.0.1:6379> GEOADD china:city 116.28 39.54 Beijin
- (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
- (integer) 1
- 127.0.0.1:6379> GEOADD china:city 113.18 23.10 Guangzhou 114.05 22.52 Shengzhen
- (integer) 2
- 127.0.0.1:6379> GEOPOS china:city Beijin # 获取指定城市的经度和纬度
- 1) 1) "116.28000229597091675"
- 2) "39.54000124957348561"
- 127.0.0.1:6379>
- 127.0.0.1:6379> GEOPOS china:city Beijin
- 1) 1) "116.28000229597091675"
- 2) "39.54000124957348561"
- 127.0.0.1:6379> GEOPOS china:city Beijin Chongqing
- 1) 1) "116.28000229597091675"
- 2) "39.54000124957348561"
- 2) 1) "106.49999767541885376"
- 2) "29.52999957900659211"
- 127.0.0.1:6379>
单位:
m表示单位为米。
km表示单位为千米。
mi表示单位为英里。
ft表示单位为英尺。
- 127.0.0.1:6379> GEODIST china:city Beijin Shanghai
- "1036715.8809"
- 127.0.0.1:6379>
- 127.0.0.1:6379> GEODIST china:city Beijin Shanghai KM #表示千米
- "1036.7159"
- 127.0.0.1:6379>
如何查看我附近的人呢?(获得所有的附近的人的地址,定位!通过半径来查询!)
- 127.0.0.1:6379> GEORADIUS china:city 110 30 1000 KM #以110 30 这个经度纬度作为中心点。
- 1) "Chongqing"
- 2) "Shengzhen"
- 3) "Guangzhou"
- 127.0.0.1:6379> GEORADIUS china:city 110 30 500 KM
- 1) "Chongqing"
- 127.0.0.1:6379>
- 127.0.0.1:6379> GEORADIUS china:city 110 30 500 KM withdist # 显示到中心的距离
- 1) 1) "Chongqing"
- 2) "341.9374"
- 127.0.0.1:6379>
- 127.0.0.1:6379> GEORADIUS china:city 110 30 1000 KM withdist withcoord count 1 #限制查看的数量
- 1) 1) "Chongqing"
- 2) "341.9374"
- 3) 1) "106.49999767541885376"
- 2) "29.52999957900659211"
- 127.0.0.1:6379> GEORADIUS china:city 110 30 1000 KM withdist withcoord count 2
- 1) 1) "Chongqing"
- 2) "341.9374"
- 3) 1) "106.49999767541885376"
- 2) "29.52999957900659211"
- 2) 1) "Guangzhou"
- 2) "829.9936"
- 3) 1) "113.18000167608261108"
- 2) "23.10000005307264104"
- 127.0.0.1:6379> GEORADIUS china:city 110 30 1000 KM withdist withcoord count 3
- 1) 1) "Chongqing"
- 2) "341.9374"
- 3) 1) "106.49999767541885376"
- 2) "29.52999957900659211"
- 2) 1) "Guangzhou"
- 2) "829.9936"
- 3) 1) "113.18000167608261108"
- 2) "23.10000005307264104"
- 3) 1) "Shengzhen"
- 2) "924.6408"
- 3) 1) "114.04999762773513794"
- 2) "22.5200000879503861"
- 127.0.0.1:6379>
- 127.0.0.1:6379> GEORADIUSBYMEMBER china:city Chongqing 1000 km
- 1) "Chongqing"
- 2) "Guangzhou"
- 127.0.0.1:6379>
- # 将二维的字符串转换为一维的字符串,如果两个字符串接近,那么距离越近
- 127.0.0.1:6379> GEOHASH china:city Beijin Chongqing
- 1) "wx48yn090q0"
- 2) "wm5xzrybty0"
- 127.0.0.1:6379>
- 127.0.0.1:6379> ZRANGE china:city 0 -1 # 查看地图中所有的元素
- 1) "Chongqing"
- 2) "Shengzhen"
- 3) "Guangzhou"
- 4) "Shanghai"
- 5) "Beijin"
- 127.0.0.1:6379> ZREM china:city Beijin # 移除元素
- (integer) 1
- 127.0.0.1:6379> ZRANGE china:city 0 -1
- 1) "Chongqing"
- 2) "Shengzhen"
- 3) "Guangzhou"
- 4) "Shanghai"
- 127.0.0.1:6379>
基数是什么?
基数是用来表示一个集合中元素个数的概念。它通常用于描述集合的大小或元素的数量。基数可以是非负整数,包括零。基数为零表示集合是空的,没有元素。
- 如果一个集合包含了3个元素,那么它的基数是3。
- 如果一个集合为空,那么它的基数是0。
网页的uV (一个人访问一个网站多次,但是还是算作一个人!)
传统的方式,set 保存用户的id,然后就可以统计set 中的元素数量作为标准判断!
这个方式如果保存大量的用户id,就会比较麻烦!因为我们的目的是计数用户数量,而并不是用来保存用户id的。
优点∶占用的内存是固定,2^64不同的元素的技术,只需要废12KB内存!如果要从内存角度来比较的话Hyperloglog首选!
- 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 jz x c v b n m # 创建第二组元素 mykey2
- (integer) 1
- 127.0.o.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或者自己的数据类型即可!
统计用户信息,活跃,不活跃!登录、未登录!打卡,365打卡!两个状态的,都可以使用Bitmaps !
Bitmaps位图,数据结构!都是操作二进制位来进行记录,就只有0和1两个状态!|
使用bitmap来记录周一到周日的打卡!
周一:1 周二:0 周三:0 周四: 1 .....
查看某一天是否打卡
统计操作:统计打卡的天数(只有三天打卡了)