侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

在redis中三种特殊数据类型:地理位置、基数(cardinality)估计、位图(Bitmap)使用场景介绍浅析

Redis  /  管理员 发布于 1年前   498

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

  • 上一条:
    用于Laravel的RoadRunner键值缓存器
    下一条:
    Laravel 10.15版本发布
  • 昵称:

    邮箱:

    2条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在Redis中能实现的功能、常见应用介绍(0个评论)
    • 2024年Redis面试题之一(0个评论)
    • 在redis缓存常见出错及解决方案(0个评论)
    • 在redis中三种特殊数据类型:地理位置、基数(cardinality)估计、位图(Bitmap)使用场景介绍浅析(2个评论)
    • Redis 删除 key用 del 和 unlink 有啥区别?(1个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-12
    • 2020-03
    • 2020-05
    • 2021-04
    • 2022-03
    • 2022-05
    • 2022-08
    • 2023-02
    • 2023-04
    • 2023-07
    • 2024-01
    • 2024-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客