目录
[Redis 三种特殊的数据类型:](#Redis 三种特殊的数据类型:)
GEORADIUS:以给定的经纬度为中心,找出某一半径内的元素
GEORADIUSBYMEMBER:找出位于指定范围内的元素,中心点是由给定的位置元素决定
[GEO底层的实现原理其实就是Zset !我们可以使用Zset命令来操作geo !](#GEO底层的实现原理其实就是Zset !我们可以使用Zset命令来操作geo !)
Redis 三种特殊的数据类型:
Geospatial:地理位置
Hyperloglog:基数统计的算法
Bitmaps:位图(位存储)
Geospatial:地理位置
如我需要查询朋友的定位,附近的人,打车所需距离的计算?
这个功能可以推算地理位置的信息,比如说两地之间的距离,方圆几里之内的人
可以查询一些测试数据:全国城市经纬度查询-知之小工具 (100xgj.com)
Geospatial类型常用的命令:
GEOADD:添加地理位置
#规则:两极是无法直接添加的,我们一般会下载城市数据,直接通过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
GEOPOS:获取地理位置
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>
GEODIST:返回两个给定位置之间的距离
单位:
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>
如何查看我附近的人呢?(获得所有的附近的人的地址,定位!通过半径来查询!)
GEORADIUS:以给定的经纬度为中心,找出某一半径内的元素
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>
GEORADIUSBYMEMBER:找出位于指定范围内的元素,中心点是由给定的位置元素决定
127.0.0.1:6379> GEORADIUSBYMEMBER china:city Chongqing 1000 km
1) "Chongqing"
2) "Guangzhou"
127.0.0.1:6379>
GEOHASH:返回一个或多个位置元素的Geohash表示
# 将二维的字符串转换为一维的字符串,如果两个字符串接近,那么距离越近
127.0.0.1:6379> GEOHASH china:city Beijin Chongqing
1) "wx48yn090q0"
2) "wm5xzrybty0"
127.0.0.1:6379>
GEO底层的实现原理其实就是Zset !我们可以使用Zset命令来操作geo !
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>
Hyperloglog:基数统计的算法
基数是什么?
基数是用来表示一个集合中元素个数的概念。它通常用于描述集合的大小或元素的数量。基数可以是非负整数,包括零。基数为零表示集合是空的,没有元素。
- 如果一个集合包含了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或者自己的数据类型即可!
Bitmaps:位图(位存储)
统计用户信息,活跃,不活跃!登录、未登录!打卡,365打卡!两个状态的,都可以使用Bitmaps !
Bitmaps位图,数据结构!都是操作二进制位来进行记录,就只有0和1两个状态!|
例如:
使用bitmap来记录周一到周日的打卡!
周一:1 周二:0 周三:0 周四: 1 .....
查看某一天是否打卡
统计操作:统计打卡的天数(只有三天打卡了)