Redis 特殊数据类型
Geospatial(地理空间)
定位?打车距离?
Redis 的 GEO 可以计算地理位置信息,两地距离等等
GEO 很简单,只有以下六个命令:
GETADD
GEODIST
GETHASH
GEOPOS
GEORADIUS
GEORAIDUSBYMEMBER
GETADD
GEOADD key longitude latitude member
:添加地理空间,longitude
:经度,latitude
:纬度,注意两级地址(北极、南极)不能添加
1 | hominsu-redis-docker:0>GEOADD china:city 116.23 40.22 beijing |
GETPOS
GEOPOS key member [member ...]
:查询 member 的经纬度
1 | hominsu-redis-docker:0>GEOPOS china:city kunming |
GEOHASH
GEOHASH key member [member ...]
:将经纬度转换成一个 11 个字符的 GeoHash 字符串
1 | hominsu-redis-docker:0>GEOHASH china:city guangzhou kunming |
GEODIST
GEODIST key member1 member2 [unit]
:查询两个位置之间的距离,unit 为单位,可选项如下所示:
- m:米
- km:千米
- mi:英里
- ft:英尺
1 | hominsu-redis-docker:0>GEODIST china:city kunming guangzhou m |
GEORADIUS
GEORADIUS key longitude latitude radius unit [withcoord] [withdist] [withhash] [count]
:获取以某个指定位置的半径范围内的其他位置,参数如下:
longitude
:经度,latitude
:纬度,radius
:半径大小unit
:单位,[withcoord]
:返回值中加上经纬度,[withdist]
:返回值中加上直线距离,[withhash]
:返回值加上半径中其他位置的 Hash[count]
:指定查询数量
1 | hominsu-redis-docker:0>GEORADIUS china:city 100 30 1000 km withcoord withdist withhash |
GEORAIDUSBYMEMBER
GEORADIUSBYMEMBER key member radius unit [withcoord] [withdist] [withhash] [count]
:获取位置空间中指定某一个位置的半径范围内的其他位置,参数如下:
member
:位置,unit
:单位,radius
:半径大小[withcoord]
:返回值中加上经纬度,[withdist]
:返回值中加上直线距离,[withhash]
:返回值加上半径中其他位置的 Hash[count]
:指定查询数量
1 | hominsu-redis-docker:0>GEORADIUSBYMEMBER china:city chengdu 1500 km withcoord withdist withhash count 2 |
GEO 其他操作
GEO 底层是通过 Sorted Sets(有序序列)实现的,因此可以使用 Sorted Sets 的命令来操作 GEO
通过 ZRANGE
来获取全部的城市名称
1 | hominsu-redis-docker:0>ZRANGE china:city 0 -1 |
通过 ZREM
来移除城市
1 | hominsu-redis-docker:0>ZREM china:city beijing |
ZCARD
:查询元素个数
1 | hominsu-redis-docker:0>ZCARD china:city |
HyperLogLogs
基数:集合之间不重复的元素个数(去重后的元素个数)
A { 1, 3, 5, 7 }
B { 3, 5, 7, 9 }
基数 = 5
应用:访问统计
⚠️注意:HyperLogLogs 有错误率,能接受错误的应用场景才能使用 HyperLogLogs,否则就使用 Sets
添加和统计
PFADD key element [element]
:创建一组元素
PFCOUNT key
:创建元素个数
1 | hominsu-redis-docker:0>PFADD key a b c d e f g h i j |
合并
PFMEERGE destkey sourcekey [sourcekey ...]
:合并
1 | hominsu-redis-docker:0>PFMERGE key3 key key2 |
Bitmaps
位储存(只有 0、1 两个状态),只有两个状态就可以使用 Bitmaps
统计用户信息:活跃、不活跃,登录、未登录等等
SETBIT
SETBIT key offset value
:offset
是操作的偏移地址
设置一个每个星期的打卡检测
1 | hominsu-redis-docker:0>SETBIT sign 0 0 |
GETBIT
GETBIT key offset
:获取某个偏移地址中保存的值
1 | hominsu-redis-docker:0>GETBIT sign 3 |
BITCOUNT
BITCOUNT key
:统计值为 1 的位
1 | hominsu-redis-docker:0>BITCOUNT sign |