【redis】三种特殊数据类型

大城市里の小女人 提交于 2021-01-06 08:17:52

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

  1. HyperLogLog 是用来做基数统计的算法
  2. 基数:比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。
  3. 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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!