Redis的三种特殊类型
geospatial 地理空间
可实现朋友定位、附近的人、打车距离计算等功能,城市经纬度可通过 城市经纬度查询-国内城市经度纬度在线查询工具 查询,有 6 个相关命令:GEOADD
、GEODIST
、GEOHASH
、GEOPOS
、GEORADIUS
、GEORADIUSBYMEMBER
。
1. geoadd
添加地理位置,格式:geoadd 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 chongqing 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
2. geopos
返回给定名称的纬度和经度
127.0.0.1:6379> GEOPOS china:city xian
1) 1) "108.9600017668167114"2) "34.25999964418929977"
127.0.0.1:6379> GEOPOS china:city xian beijing
1) 1) "108.9600017668167114"2) "34.25999964418929977"
2) 1) "116.39999896287918091"2) "39.90000009167092543"
3. geodist
返回两个给定位置之间的距离,单位支持 m(米)
、km(千米)
、mi(英里)
、ft(英尺)
127.0.0.1:6379> GEODIST china:city beijing xian km
"910.0565"
127.0.0.1:6379> GEODIST china:city hangzhou xian km
"1143.6295"
4. geohash
返回一个 11 个字符的 geohash 字符串
127.0.0.1:6379> GEOHASH china:city xian
1) "wqj6zky6bn0" # 指定元素的纬度和经度的字符串
5. georadius
以给定的纬度经度为中心,找到某一半径内的元素
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km
1) "chongqing"
2) "xian"
3) "shengzhen"
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 500 km withcoord
1) 1) "chongqing"2) 1) "106.49999767541885376"2) "29.52999957900659211"
2) 1) "xian"2) 1) "108.9600017668167114"2) "34.25999964418929977"
6. georadiusbymember
以一个成员为中心,查找指定半径范围内的元素
127.0.0.1:6379> GEORADIUSBYMEMBER china:city xian 1000 km
1) "xian"
2) "chongqing"
3) "beijing"
7. geo 的底层
geo 的底层是一个 zset 集合,可通过 zset 相关命令操作,如:
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city shanghai
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "beijing"
hyperloglog
(一)基数的概念
集合 A{1,3,5,7,8,7}
和 B{1,3,5,7,8}
,它们的基数(不重复元素个数)为 5 ,允许一定误差。
(二)简介
Redis Hyperloglog 是基数统计算法。优点是占用内存固定,对 \(2^{64}\) 不同元素计数,仅需 12KB 空间,误差率约 0.81% 。
(三)使用示例
# 添加元素
127.0.0.1:6379> PFADD myset a b c d e f f g h
(integer) 1
# 统计基数
127.0.0.1:6379> PFCOUNT myset
(integer) 8
# 添加另一个集合元素
127.0.0.1:6379> PFADD myset2 g h t n m k l e r
(integer) 1
# 统计(存在误差)
127.0.0.1:6379> PFCOUNT myset2
(integer) 8
# 合并集合
127.0.0.1:6379> PFMERGE myset3 myset myset2
OK
# 统计合并后基数
127.0.0.1:6379> PFCOUNT myset3
(integer) 13
bitmaps
bitmaps 是位图存储,用二进制位记录,适用于只有两种状态场景(如登录 / 未登录等 )。
1. setbit
在 bitmaps 中添加数据,格式 setbit key offset value
127.0.0.1:6379> SETBIT sign 0 1
(integer) 0
127.0.0.1:6379> SETBIT sign 1 1
(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 0
(integer) 0
127.0.0.1:6379> SETBIT sign 6 0
(integer) 0
2. getbit
查看位图中某个位置的值,格式 getbit key offset
127.0.0.1:6379> getbit sign 4
(integer) 0
127.0.0.1:6379> getbit sign 3
(integer) 1
3. bitcount
统计位图中值为 1 的个数,格式 bitcount key start end
127.0.0.1:6379> BITCOUNT sign 0 -1
(integer) 4