在redis中三种特殊数据类型:地理位置、基数(cardinality)估计、位图(Bitmap)使用场景介绍浅析
Redis  /  管理员 发布于 1年前   429
Redis中的三种特殊数据类型:地理位置存储、基数(cardinality)估计、位图(Bitmap)。
geospatial 地理位置存储
地理位置数据类型主要用于存储地理位置信息,如经纬度坐标。
Redis通过使用地理位置数据类型可以方便地进行地理位置相关的查询和计算,如计算两个地点之间的距离、查找某个地点附近的其他地点等。
在Redis中,地理位置数据类型是通过有序集合(Sorted Set)来实现的,每个成员都有一个对应的经纬度坐标。
通过使用地理位置数据类型的相关命令,可以对地理位置进行添加、删除、查询和计算等操作。
这种地理位置数据类型在很多应用场景中非常有用,比如附近的人、附近的商家、地理围栏等。
它能够帮助开发者轻松地处理地理位置相关的业务需求。
getadd
用于添加地理位置
需要注意一下几点:
两级无法直接添加,大量数据可以直接通过相关程序一次性导入
当经纬度超出一定范围时,会报超范围错误
实例:
127.0.0.1:6379> geoadd china:city 116.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
(integer) 1
127.0.0.1:6379> geoadd china:city 108.96 34.26 xian
geopos
获取地理位置
实例:
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city beijing shanghai
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "121.47000163793563843"
2) "31.22999903975783553"
geodist
获取给定的两个位置之间的直线距离
m:米
km:千米
mi:英里
ft:英尺
实例:
# 查看两个城市之间的距离
127.0.0.1:6379> geodist china:city beijing shanghai
"1067378.7564"
127.0.0.1:6379> geodist china:city beijing shanghai km #以km为单位
"1067.3788"
georadius
给给定的一个坐标为中心,返回某个半径内的元素的值,业务场景:附近的人,附近车辆等。
实例:
# 找出110 30为中心 500 km半径内的元素
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqing"
2) "xian
# 显示直线距离
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "chongqing"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord
1) 1) "chongqing"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"
# 指定获得数量
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 1
1) 1) "chongqing"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
georadiusbymember
以地点名称为中心查询,查询指定半径内的的元素
实例:
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 2000 km
[
"chongqing",
"xian",
"shenzhen",
"hangzhou",
"shanghai",
"beijing"
]
geohash
geohash 返回一个或多个位置元素的geohash表示,使用该命令将返回11 个字符串的geohash字符串
实例:
127.0.0.1:6379> geohash china:city beijing shenzhen
[
"wx4fbxxfke0",
"ws10578st80"
]
在Redis的五大基础数据类型学完后,其实geo的底层就是使用Zset进行封装的,下面我们来使用Zset命令操作地理数据
实例:
127.0.0.1:6379> zrange china:city 0 -1 #查看所有数据
[
"chongqing",
"xian",
"shenzhen",
"hangzhou",
"shanghai",
"beijing"
]
127.0.0.1:6379> zrem china:city xian #移除西安
1
127.0.0.1:6379> zrange china:city 0 -1
[
"chongqing",
"shenzhen",
"hangzhou",
"shanghai",
"beijing"
]
hyperloglogs 基数存储
HyperLogLog是Redis中用于基数(cardinality)估计的数据结构。
基数是指一个集合中不重复元素的数量。HyperLogLog通过使用固定的内存空间来估计一个集合的基数,而不需要存储集合的实际元素。
HyperLogLog的优势在于它可以在极小的内存占用下实现高效的基数估计。
它的误差率通常在0.81%左右,即估计的基数与实际基数之间的相对误差不超过0.81%。
这使得HyperLogLog非常适合于大规模的基数统计场景,如统计网站的独立访客数、统计用户的活跃度等。
在Redis中,通过使用HyperLogLog数据类型的相关命令,可以对HyperLogLog进行添加元素、计算基数、合并多个HyperLogLog等操作。
Ps:
这里需要先介绍一下基数,将一个系列的容器中,去重后的元素个数。
例如:{1, 2, 2, 5, 7, 7, 8, 12, 34} 原来总数为:9,基数:7
hyperloglogs是Redis统计基数的算法,有优点是:
占用内存固定,2^64不同元素,只需要2KB的内存,从内存的角度来说使用hyperloglogs是很好的。
使用场景
统计网站的访问量,每一个设备只能访问计数一次,多次访问都是一次。
传统的方式,set保存用户的id,然后就可以统计set中的元素数量作为标准判断
这个方式如果保存大量的用户id,就会比较麻烦,我们的目的是为了计数,而不是保存用户id
但是需要注意:0.81%错误率!统计任务,可以忽略不计的
实例:
# 添加一个hyperloglog ,重复则替换
127.0.0.1:6379> pfadd key1 a b c d e f g
1
# 统计一个key1中有多少元素
127.0.0.1:6379> PFCOUNT key1
7
127.0.0.1:6379> pfadd key2 a b c d e f g h i j k l m n
1
127.0.0.1:6379> PFCOUNT key2
14
# 合并两个hyperloglog,求并集
127.0.0.1:6379> PFMERGE mykey key1 key2
OK
127.0.0.1:6379> PFCOUNT mykey
14
127.0.0.1:6379>
bitmaps 位存储
位图是Redis中的一种数据结构,用于对位(bit)进行存储和操作。
位图可以将一系列的位(0或1)组织起来,每个位都可以表示某种状态或标记。
在Redis中,位图通常用于存储某种状态的标记,如用户的在线状态、用户的签到记录、用户的兴趣标签等。
通过使用位图数据类型的相关命令,可以对位图进行位的设置、位的获取、位的计数等操作。
位图在存储上非常节省空间,因为每个位只占用一个二进制位。
此外,Redis还提供了一些位操作的命令,如位与(AND)、位或(OR)、位异或(XOR)等,可以对多个位图进行逻辑运算。
实例:
使用bitmaps来记录周一到周日的打卡情况:1打卡;0未打卡
周一(0): 1;周二(1): 0;周三(2): 1;周四(3): 0;周五(4): 1;周六(5): 1;周日(6): 1
ps:
你看你什么成分还想周末休息,赶紧加班吧!
# 某员工打卡情况
127.0.0.1:6379> setbit sign 0 1
0
127.0.0.1:6379> setbit sign 1 0
0
127.0.0.1:6379> setbit sign 2 1
0
127.0.0.1:6379> setbit sign 3 0
0
127.0.0.1:6379> setbit sign 4 1
0
127.0.0.1:6379> setbit sign 5 1
0
127.0.0.1:6379> setbit sign 6 1
0
# 老板心情好查看一下某员工的打卡情况
# 查看对应存的值
127.0.0.1:6379> getbit sign 2
1
# 周四忘打卡,拿不到全勤奖金了!
127.0.0.1:6379> getbit sign 3
0
# 统计打开天数
127.0.0.1:6379> bitcount sign
5
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号