【Redis 系列】redis 学习五,多学习一些 redis 的三种特殊数据类型
redis 三种特殊的数据类型
- Geospatial 地理位置
- Hyperloglog 基数统计
- Bitmap 位图场景
Geospatial 地理位置
redis 3.2 版本就推出了 Geospatial
官方文档上可以详细的看到用法:
www.redis.net.cn/order/3685.html
Geospatial 可以使用在如下场景:
- 附近的人
- 打车计算距离
- 朋友定位
- 等一系列跟定位有关的场景
Geospatial 只有 六个命令
GEOADD
添加地理位置
- 有效的经度从-180度到180度。
- 有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。
- GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member …]
添加经纬度,城市名
GEOADD city 113.087559 28.251818 changsha | |
(integer) 1 | |
GEOADD city 114.064552 22.548457 shenzhen | |
(integer) 1 | |
GEOADD city 104.087045 30.666416 chengdu | |
(integer) 1 | |
GEOADD city 118.802422 32.064653 nanjing | |
(integer) 1 | |
GEOADD city 106.558434 29.568996 chongqing | |
(integer) 1 | |
GEOADD city 121.463615 31.195908 shanghai | |
(integer) 1 | |
GEOADD city 117.208093 39.091103 tianjin | |
(integer) 1 |
GEOPOS
- GEOPOS key member [member …]
获取指定城市的经纬度信息
GEOPOS city changsha | |
1) 1) "113.08755666017532349" | |
2) "28.25181827470789386" | |
GEOPOS city tianjin | |
1) 1) "117.20809489488601685" | |
2) "39.0911021322545551" |
GEODIST
- GEODIST key member1 member2 [m|km|ft|mi]
其中有如下 4 个单位:
m :米
km:公里
ft:英尺
mi:英里
获取两个城市之间的距离
GEODIST city changsha tianjin | |
"1264101.6876" | |
GEODIST city changsha tianjin km | |
"1264.1017" | |
GEODIST city changsha shenzhen km | |
"641.9034" |
GEOHASH
- GEOHASH key member [member …]
返回一个或者多个GEOHASH 表示的元素, 返回 11 个字符 Geohash 字符串
GEOHASH city changsha | |
1) "wt02tr5fg00" | |
GEOHASH city changsha beijing | |
1) "wt02tr5fg00" | |
2) (nil) | |
GEOHASH city changsha beijing tianjin chongqing | |
1) "wt02tr5fg00" | |
2) (nil) | |
3) "wwgq7hk64t0" | |
4) "wm7b0yc7zk0" |
GEORADIUS
- GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOR
指定经纬度作为原点,指定半径,查询在指定范围内的城市,这些城市都是在我们自己的集合里面
GEORADIUS city 110 30 500 m | |
(empty array) | |
GEORADIUS city 110 30 500 km | |
1) "chongqing" | |
2) "changsha" | |
GEORADIUS city 110 30 1000 km | |
1) "chongqing" | |
2) "chengdu" | |
3) "shenzhen" | |
4) "changsha" | |
5) "nanjing" | |
GEORADIUS city 110 30 700 km withcoord | |
1) 1) "chongqing" | |
2) 1) "106.55843228101730347" | |
2) "29.56899626404301529" | |
2) 1) "chengdu" | |
2) 1) "104.08704489469528198" | |
2) "30.6664164635846177" | |
3) 1) "changsha" | |
2) 1) "113.08755666017532349" | |
2) "28.25181827470789386" | |
GEORADIUS city 110 30 700 km withdist | |
1) 1) "chongqing" | |
2) "335.6530" | |
2) 1) "chengdu" | |
2) "572.3911" | |
3) 1) "changsha" | |
2) "357.4711" | |
GEORADIUS city 110 30 700 km withhash | |
1) 1) "chongqing" | |
2) (integer) 4026059435699931 | |
2) 1) "chengdu" | |
2) (integer) 4026137831798506 | |
3) 1) "changsha" | |
2) (integer) 4050903792284309 |
GEORADIUSBYMEMBER
- GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]
找出位于指定元素周围的城市
GEORADIUSBYMEMBER city tianjin 1000 km | |
1) "nanjing" | |
2) "tianjin" | |
3) "shanghai" | |
GEORADIUSBYMEMBER city tianjin 500 km | |
1) "tianjin" | |
GEORADIUSBYMEMBER city tianjin 5000 km | |
1) "chongqing" | |
2) "chengdu" | |
3) "shenzhen" | |
4) "changsha" | |
5) "shanghai" | |
6) "nanjing" | |
7) "tianjin" |
Geospatial 底层的原理就是使用 Zset 有序集合来实现的,我们可以使用 Zset 有序集合的命令来操作 Geo ,咱们是用 Zset 的指令来感受一波
ZRANGE city 0 -1 | |
1) "chongqing" | |
2) "chengdu" | |
3) "shenzhen" | |
4) "changsha" | |
5) "shanghai" | |
6) "nanjing" | |
7) "tianjin" | |
ZCARD city | |
(integer) 7 |
Hyperloglog 基数统计
基数是个啥?
基数,就是不重复的数,例如:
A = {1,2,3,4,5}
B = {2,3,4,5,6}
那么 A 和 B 的取并集的基数就是 6
简介
Hyperloglog 是 redis 2.8.9 版本开始有的这种数据结构
redis hyperloglog 基数统计也是一种算法
例如有这样的应用场景:
- 网页访问人数统计,同一个用户多次访问网站,也是只算作 1
- 传统的方式是使用 set 集合的方式来保存 id,统计 set 里面 id 的个数,来计算人数
- 这种方式也没有问题,但是若数据量很大的时候,就会非常麻烦,因为我们拿 id 是没有用的,我们只需要计数而已
优点
Hyperloglog 占用的内存空间是固定的,2^16 次方,只需要占用 12 KB 内存,从内存的角度来技术选型,Hyperloglog 是首选哦
- PFADD key element [element …]
向 Hyperloglog 中添加一个或者多个元素
- PFMERGE destkey sourcekey [sourcekey …]
将多个 Hyperloglog 取并集,得到一个结果 Hyperloglog ,里面的数据是不会重复的
PFADD myhash 1 2 3 4 5 6 7 8 | |
(integer) 1 | |
3 4 5 6 7 8 9 0 88 99 | pfadd myhash2|
(integer) 1 | |
PFMERGE res myhash myhash2 | |
OK | |
PFCOUNT res | |
(integer) 12 | |
PFCOUNT myhash | |
(integer) 8 | |
PFCOUNT myhash2 | |
(integer) 10 |
Bitmaps 位图场景
Bitmaps 位图,位存储
一般用于,统计用户信息,活跃,不活跃,
登录,不登录
打卡,不打卡 等等,两种状态
Bitmaps 位图,也是一种数据结构,是操作二进制的方式来进行记录的,只有 0 和 1 两种状态
例如我们举个例子,来记录着一周每天的心情,1 是开心,0 是沮丧
- SETBIT key offset value
设置 bit 位的值
- GETBIT key offset
获取 bit 位的值
SETBIT week 0 1 | |
(integer) 0 | |
SETBIT week 1 1 | |
(integer) 0 | |
SETBIT week 2 1 | |
(integer) 0 | |
SETBIT week 3 0 | |
(integer) 0 | |
SETBIT week 4 0 | |
(integer) 0 | |
SETBIT week 5 1 | |
(integer) 0 | |
SETBIT week 6 1 | |
(integer) 0 | |
GETBIT week 6 | |
(integer) 1 | |
GETBIT week 5 | |
(integer) 1 |
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是小魔童哪吒,欢迎点赞关注收藏,下次见~