Redis 三种特殊类型
中文官网
https://www.redis.net.cn/tutorial/3501.html
Geospatial
定位、附近的人、距离计算
五个命令
GEOADD
# GEOADD 命令
# 规则,两级无法添加,一般下载城市数据,直接通过java导入
# 参数 key 值(维度、精度、名称)
# 有效的经度从-180度到180度。
# 有效的纬度从-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
GEOADD china:city 116.40 39.90 beijing
GEOADD china:city 121.47 31.23 shanghai
GEOADD china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen
GEOADD china:city 120.16 30.24 hangzhou 108.96 34.26 xian
GEOPOS
# 获取城市数据,获得当前定位,一定是一个坐标值
GETPOS china:city beijing # 获取指定的经纬度
GETPOS china:city beijing chongqing
GEODIST
# 查询两地点直线距离 默认:m
GEODIST china:city beijing shanghai
# 查询两地点之间的距离 km
GEODIST china:city beijing shanghai km
GEORADIUS
以某点为中心查找指定距离的地点
# 查找距离 该点(经纬度为110,30) 1000km以内的城市
GEORADIUS china:city 110 30 1000 km
# 查找距离 该点(经纬度为110,30) 1000km以内的城市 带有距离
GEORADIUS china:city 110 30 1000 km withdist
# 查找距离 该点(经纬度为110,30) 1000km以内的城市 带有经纬度
GEORADIUS china:city 110 30 1000 km withcoord
# 查找距离 该点(经纬度为110,30) 1000km以内的城市 带有经纬度,查询2个
GEORADIUS china:city 110 30 1000 km withcoord count 2
GEORADIUSBYMEMBER
# 找到北京1000km范围内的城市 beijing 必须存在于china:city
GEORADIUSBYMEMBER china:city beijing 1000 km
GEOHASH
通常使用表示位置的元素使用不同的技术,使用Geohash位置52点整数编码。由于编码和解码过程中所使用的初始最小和最大坐标不同,编码的编码也不同于标准。此命令返回一个标准的Geohash。
Geohash字符串属性
该命令将返回11个字符的Geohash字符串,所以没有精度Geohash,损失相比,使用内部52位表示。返回的geohashes具有以下特性:
- 他们可以缩短从右边的字符。它将失去精度,但仍将指向同一地区。
- 它可以在 geohash.org 网站使用,网址 http://geohash.org/。查询例子:http://geohash.org/sqdtr74hyu0.
- 与类似的前缀字符串是附近,但相反的是不正确的,这是可能的,用不同的前缀字符串附近。
返回值
一个数组, 数组的每个项都是一个 geohash 。 命令返回的 geohash 的位置与用户给定的位置元素的位置一一对应。
# 将二维的经纬度转换成一维的字符串,字符串越接近,距离越近
GEOHASH china:city beijing chongqing
B站:狂神说
GEO 底层原理 为Zset! 可以使用Zset命令操作GEO
ZRANG china:city 0 1
ZREM china:city beijing
ZRANG china:city 0 1
Hyperloglog
https://www.redis.net.cn/tutorial/3513.html
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
场景:访问网站次数(UV),一个访问一个网站多次也算一个人
如果使用set保存用户id,然后就可以统计set中的元素数量
但是如果保存大量的用户ID,就会耗费大量的空间!我们的目的是为了计数,不是为了保存用户ID
优点:占用的内存小
缺点:存在0.81%的错误率
命令及描述
1 PFADD key element [element …] 添加指定元素到 HyperLogLog 中。
2 PFCOUNT key [key …] 返回给定 HyperLogLog 的基数估算值。
3 PFMERGE destkey sourcekey [sourcekey …] 将多个 HyperLogLog 合并为一个 HyperLogLog
PFadd mykey a b c d e f g h i j
PFCOUNT mykey # 10
PFADD mykey2 i j k l m n o p
PFCOUNT mykey2 # 8
PFMERGE mykey3 mykey mykey2
PFCOUNT mykey3 # 16
Bitmap
位存储,适合有两个状态的
Bitmap 位图,都是通过二进制位来记录
# 一周打卡
setbit sign 0 1 #第一天打卡
setbit sign 1 0 #第二天未打卡
getbit sign 1 # 查看第二天是否打卡
# 统计打卡天数
bitcount sign # 统计打卡天数
参考:B站狂神说