Redis三种特殊数据类型的具体使用
作者:一心同学
一、HyperLogLog 基数统计
1.1 什么是基数?
我们直接通过一个例子就可以明白什么是基数统计,比如数据集 {1, 2, 3, 3, 5, 5,}, 那么这个数据集的基数集为 {1,2,3,5}, 基数(不重复元素)为4。也就是说是不重复元素的个数。
1.2 使用基数统计的好处
每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。如果要从内存角度来比较的话Hyperloglog是首选。
1.3 应用场景
网页的uv(一个人访问一个网站多次,但是还是算做一个人)
- 🚀 传统的方式:set(因为set不允许重复,如果重复就覆盖)保存用户的id,然后就可以统计,set中元素数量作为标准判断,这个方式如果保存大量的用户id,就会比较麻烦并且在大型网站中会占用大量的内存。我们的目的是为了计数,而不是保存用户id。
- 🚀 使用HyperLogLog:一个HyperLogLog 键只需要12KB,能够计算的数量却非常巨大,占用的内存空间大大减少。
1.4 注意事项
如果允许容错(0.81% 错误率,计数的话可以忽略不计),那么一定可以使用Hyperloglog!如果不允许容错,就使用set或者自己的数据类型即可!
1.5 基本命令
序号 | 命令及描述 |
---|---|
1 | PFADD key element [element ...] 添加指定元素到 HyperLogLog 中。 |
2 | PFCOUNT key [key ...] 返回给定 HyperLogLog 的基数估算值。 |
3 | PFMERGE destkey sourcekey [sourcekey ...] 将多个 HyperLogLog 合并为一个 HyperLogLog |
1.6 使用
127.0.0.1:6379> pfadd mykey1 a b c d e f #给第一组添加数据 (integer) 1 127.0.0.1:6379> pfcount mykey1 #统计mykey1的基数数量 (integer) 6 127.0.0.1:6379> pfadd mykey2 e e f j #给第二组添加数据 (integer) 1 127.0.0.1:6379> pfcount mykey2 #统计mykey2的基数数量 (integer) 3 127.0.0.1:6379> pfmerge mykey3 mykey1 mykey2 # 合并两组 mykey1 mykey2 => mykey3 并集 OK 127.0.0.1:6379> pfcount mykey3 #统计mykey3的基数数量 (integer) 7
二、Geospatial 地理位置
2.1 介绍
Redis3.2 版本开始推出的Geospatial,可以推算地理位置的信息,两地之间的距离,方圆几里的人。
2.2 使用场景
- 🚀 朋友定位
- 🚀 查看附近的人
- 🚀 打车距离计算
2.3 基本命令
序号 | 命令及描述 |
---|---|
1 | GEOADD key 经度 纬度 地点名称 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中 |
2 | GEOPOS key 地点名称 从key里返回所有给定位置元素的位置(经度和纬度)。 |
3 | GEODIST key 地点1 地点2 单位 返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在, 那么命令返回空值。 |
4 | GEORADIUS key 经度 纬度 范围数值 单位 以给定的经纬度为中心, 找出某一半径内的元素 |
5 | GEORADIUSBYMEMBER key 地点 距离数值 单位 找出位于指定范围内的元素,中心点是由给定的位置元素决定 |
6 | GEOHASH key 地点1 地点2 将返回11个字符的Geohash字符串,如果两个字符串越接近,那么则距离越近。 |
7 | zrange key start stop 获得指定key中坐标信息 |
8 | zrem key 地点 删除指定key下指定目标的数据 |
查询地点经纬度:
2.4 详细讲解
2.4.1 GEOADD
作用:添加地理位置
规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
语法:GEOADD key 经度 纬度 地点名称
🔥 注意事项
有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。
🌵 使用
#添加单个信息 127.0.0.1:6379> geoadd address 116.708463 23.37102 shantou (integer) 1 #添加多个信息 127.0.0.1:6379> geoadd address 116.405285 39.904989 beijin 121.472644 31.231706 shanghai (integer) 2
2.4.2 GEOPOS
作用:获得指定地点的位置信息(经纬度)
语法:GEOPOS key 地点名称
🌵 使用
127.0.0.1:6379> geopos address beijin #获得北京的地理位置 1) 1) "116.40528291463851929" #经度 2) "39.9049884229125027" #纬度
2.4.3 GEODIST
作用:返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在, 那么命令返回空值。
语法:GEODIST key 地点1 地点2 单位
🔥 单位参数:
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
🌵 使用:
127.0.0.1:6379> geodist address beijin shanghai km #查询北京与上海之间的距离 "1067.5980"
2.4.4 GEORADIUS
作用:以给定的经纬度为中心, 找出某一半径内的元素。
语法:GEORADIUS key 经度 纬度 范围数值 单位
🌵 使用:
#查找以116,39这个经纬度为中心,寻找方圆1500km的城市 127.0.0.1:6379> georadius address 116 39 1500 km 1) "shanghai" 2) "beijin" # 显示到中间距离的位置 127.0.0.1:6379> georadius address 116 39 1500 km withdist 1) 1) "shanghai" 2) "996.7313" 2) 1) "beijin" 2) "106.5063" #显示他人的定位信息 127.0.0.1:6379> georadius address 116 39 1500 km withcoord 1) 1) "shanghai" 2) 1) "121.47264629602432251" 2) "31.23170490709807012" 2) 1) "beijin" 2) 1) "116.40528291463851929" 2) "39.9049884229125027" #筛选出最近的城市以及显示其距离 127.0.0.1:6379> georadius address 116 39 1500 km withdist withcoord count 1 1) 1) "beijin" 2) "106.5063" 3) 1) "116.40528291463851929" 2) "39.9049884229125027" #筛选最近两个城市以及显示其距离 127.0.0.1:6379> georadius address 116 39 1500 km withdist withcoord count 2 1) 1) "beijin" 2) "106.5063" 3) 1) "116.40528291463851929" 2) "39.9049884229125027" 2) 1) "shanghai" 2) "996.7313" 3) 1) "121.47264629602432251" 2) "31.23170490709807012"
2.4.5 GEORADIUSBYMEMBER
作用:找出位于指定范围内的元素,中心点是由给定的位置元素决定。
语法:GEORADIUSBYMEMBER key 地点 距离数值 单位
🌵 使用:
#找出距离北京方圆1500km内的城市 127.0.0.1:6379> georadiusbymember address beijin 1500 km 1) "shanghai" 2) "beijin"
2.4.6 GEOHASH
作用:将返回11个字符的Geohash字符串,如果两个字符串越接近,那么则距离越近。
语法:GEOHASH key 地点1 地点2
🌵 使用:
127.0.0.1:6379> geohash address beijin shantou 1) "wx4g0b7xrt0" 2) "ws4uzy8d030"
2.4.7 ZRANGE
作用:获得指定key中坐标信息。
语法:zrange key start stop
🌵 使用:
127.0.0.1:6379> zrange address 0 -1 1) "shantou" 2) "shanghai" 3) "beijin"
2.4.8 ZREM
作用:删除指定key下指定目标的数据。
语法:zrem key 地点
🌵 使用:
127.0.0.1:6379> zrem address shanghai (integer) 1
三、BitMap
🌴 介绍
BitMap是通过一个bit位来表示某个元素对应的值或者状态,只有0 和 1 两个状态,其中的key就是对应元素本身。365 天 = 365 bit ,1字节 = 8bit ,也就是说统计一年的用户状态只需要46 个字节左右,所以其能够节省很大的空间。
🌵 应用场景
- (1)用户签到
- (2)统计活跃用户
- (3)用户在线状态(在线就设置为1,不在线就设置为0)
🔥 使用
- 🚀 需求:记录 周一到周日的打卡
- 1:表示有打卡
- 0:表示没有打卡
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 0 (integer) 0 127.0.0.1:6379> setbit sign 3 1 (integer) 0 127.0.0.1:6379> setbit sign 4 1 (integer) 0 127.0.0.1:6379> setbit sign 5 0 (integer) 0 127.0.0.1:6379> setbit sign 6 0 (integer) 0
🚀 查看某一天是否有打卡
127.0.0.1:6379> getbit sign 3 (integer) 1 127.0.0.1:6379> getbit sign 6 (integer) 0
🚀 统计本周的打卡记录
127.0.0.1:6379> bitcount sign (integer) 4
小结
以上就是【一心同学】整理的【Redis】中的【三种特殊数据类型】,或许我们在平时很少用到,但如果我们能够用得到,那么其对我们的作用是非常大的,可以给我们【节省巨大的空间】以及【带来极快的速度】。
到此这篇关于Redis三种特殊数据类型的具体使用的文章就介绍到这了,更多相关Redis 特殊数据类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!