三种特殊数据类型
geospatial 地理位置
底层是zset实现的, 可以用zset的命令操作
geoadd 添加经纬度
GEOADD key longitude latitude member [longitude latitude member ...]
geoadd 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。
两极无法直接添加,一般会下载城市数据,直接通过java程序一次导入
127.0.0.1:6379> geoadd china:city 16.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 shenzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
geopos 获取经纬度
GEOPOS key member [member ...]
geopos 用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
127.0.0.1:6379> geopos china:city beijing #获取指定城市的经度和纬度
1) 1) "16.39999955892562866"
2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city chongqing
1) 1) "106.49999767541885376"
2) "29.52999957900659211"
geodist 给定位置之间的距离
geodist 用于返回两个给定位置之间的距离GEODIST key member1 member2 [m|km|ft|mi]
最后一个距离单位参数说明:
m :米,默认单位。
km :千米。
mi :英里。
ft :英尺。
127.0.0.1:6379> geodist china:city chongqing hangzhou km #查看重庆到杭州的直线距离
"1318.8910"
georadius、georadiusbymember 半径
georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
参数说明:
m :米,默认单位。
km :千米。
mi :英里。
ft :英尺。
WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
WITHCOORD: 将位置元素的经度和维度也一并返回。
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
COUNT 限定返回的记录数。
ASC: 查找结果根据距离从近到远排序。
DESC: 查找结果根据从远到近排序。
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km # 以110 30 这个经纬度为中心 寻找方圆1000km内的城市
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "chongqing"
2) "xian"
georadiusbymember 的中心点是由给定的位置元素决定的
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
127.0.0.1:6379> GEORADIUSBYMEMBER china:city hangzhou 1000 km #以杭州为中心 半径1000km
1) "hangzhou"
2) "shanghai"
geohash
Redis GEO 使用 geohash 来保存地理位置的坐标
geohash 用于获取一个或多个位置元素的 geohash 值。GEOHASH key member [member ...]
将二维的经纬度转换成一维的字符串,如果两个字符串越接近,则距离越近
127.0.0.1:6379> geohash china:city hangzhou chongqing
1) "wtmkn31bfb0"
2) "wm5xzrybty0"
hyperloglog
- HyperLogLog 是用来做基数统计的算法
- 基数:比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。
- HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。
会有一定误差!!
应用场景:
网站统计用户访问量 uv
pfadd
127.0.0.1:6379> pfadd mykey a b c d e
(integer) 1
127.0.0.1:6379> pfadd mykey1 a b q w o
(integer) 1
pfcount 统计基数数量
127.0.0.1:6379> pfcount mykey
(integer) 5
127.0.0.1:6379> pfcount mykey1
(integer) 5
pfmerge 合并多个hyperloglog
127.0.0.1:6379> pfmerge mykey3 mykey mykey1
OK
127.0.0.1:6379> pfcount mykey3
(integer) 8
bitmap
应用场景:
- 统计用户信息 :活跃、不活跃! 登录、未登录! 打卡!
只要是两个状态的,就可以使用bitmaps
bitmaps 都是操作二进制进行位记录
setbit
使用bitmap来记录 周一到周日的打卡
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(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 1
(integer) 0
getbit
查看某一天是否有打卡
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 6
(integer) 1
bitcount 统计
127.0.0.1:6379> bitcount sign #统计这周的打卡记录
(integer) 3
来源:oschina
链接:https://my.oschina.net/u/4288530/blog/4880893