当前位置: 首页 > news >正文

Redis其他的数据类型及渐进式遍历

Redis其他的数据类型:

Streams数据类型:

Redis Stream是Redis 5.0版本后引入的一个新数据类型,他是一个可持久化,可查询的,可扩展的消息队列服务

Stream数据类型类似于一个日志系统,数据被添加到Stream末尾,并且每个数据都会分配一个唯一的序列号,这个序列号是按照时间递增的,这使得Stream数据类型特别适合消息队列,事件驱动系统,数据流处理场景

Stream类型主要包括:

可持久性 :

redis的stream数据类型也可以像其他的数据类型一样,Stream数据类型的数据也可以被同步到磁盘上,即使Redis重启,数据也不会消失

消费者组:

Stream数据类型也支持消费者组的概念,多个消费者可以到同一个Stream中去读取数据,每个消费者都会读取自己未读取到的数据。

阻塞读取:

消费者可以选择阻塞的从Stream中进行读取数据,如果Stream中现在没有数据,则消费者可以选择等待,直到有新的数据到达。

可以读取历史数据:

消费者可以读取Stream中的历史数据,这意味着消费者在处理完当前的数据之后,还可以处理之前的数据。

Stream类型使用场景:

1.消息队列:

Redis Stream可以作为一个可持久化,可扩展的消息队列服务,用于在不同的应用组件之间进行消息传递。消费者可以实时从Stream中读取数据,还可以读取历史数据。

2.日志记录:

由于日志是按照时间顺序进行储存的,因此String非常适合用于记录日志,你可以将日志作为Stream的元素,包含日志级别,消息和时间戳等信息。

3.事件驱动系统:

在事件驱动系统中,可以用Stream类储存和传递事件,每个Stream可以是一个事件,其中记录着事件的一些内容。

4.数据流处理:

也可以将数据流作为一个Stream数据类型,然后使用消费者组来进行消费。

Geospatial数据类型:

Redis 在 3.2 版本中加入了地理空间以及索引半径查询的功能,主要用在需要地理位置的应用上。将指定的地理空间位置(经度、纬度、名称)添加到指定的 key 中,这些数据将会存储到 sorted set。这样的目的是为了方便使用 GEORADIUS 或者 GEORADIUSBYMEMBER 命令对数据进行半径查询等操作。也就是说,推算地理位置的信息,两地之间的距离,周围方圆的人等等场景都可以用它实现

HyperLogLog数据类型:

这个类型的应用场景只有一个,估算集合中的元素个数。

之前讲过set的一个应用场景,统计服务器的UV(用户访问的次数),使用Set可以满足统计UV,但是问题是,UV的数据量非常大,Set就会消耗大量的内存储空间。

因为Set中还会储存用户的userId,每个userId按照8字节算,1亿UV就会消耗800MB的内存,但是使用HyperLogLog最多12kb的空间就能实现上述效果。

HyperLogLog不储存元素的内容,但是能够记录元素的特征,从而在新增的元素的时候,能够知道当前新增的元素,是一个已经存在的数据,还是一个崭新的数据。

但是这个存在一定的误差。只不过误差在0.81%左右。

Bitmaps数据类型:

位图,使用bit位来表示整数,更加节省空间。

比如把10储存到位图中,把10储存到位图中,0000 0000 0000 0000 0010 0000 0000,通过在第十位存1,可以来储存10这个数据。

Redis bitfields数据类型:

位域,bitfields可以理解成一串二进制序列(字节数组),同时可以把这个数组中的某几位,赋予特定的含义,并且进行读取/修改/算术运算。

渐进式遍历:

keys一次性把整个Redis中的所有key都获取到,这是一个非常危险的操作。因为redis是单线程的,所以可能会阻塞redis的服务器。

但是通过渐进式遍历,就可以做到,既能获取所有的key,同时又不会卡死服务器。渐进式遍历,不是一个命令,把所有key拿到的,而是每一次执行一次命令,每一次执行的命令只能获取到其中一小部分,这样的话保证当前这一次操作不会太卡。如果想要得到更多的key就需要多次进行遍历。多次执行渐进式遍历命令。

scan cursor count 这是渐进式遍历命令。

count这里的数字不是每次非得设置成一样的,这里可以根据实际情况来设置。这里的渐进式遍历,在遍历的过程中,在服务器这边不储存任何的状态信息,此处的遍历是随机可以终止的,不会对服务器产生任何副作用。

注意:渐进式命令scan虽然解决了阻塞的问题,但如果在遍历期间键有所变化,比如增加,删除,可能导致遍历时产生遗漏或者重复遍历,这点在实际开发中考虑。


文章转载自:

http://AzwF6jgq.ztnmc.cn
http://TNIcoe6z.ztnmc.cn
http://5X4P0wPB.ztnmc.cn
http://48OKCzfg.ztnmc.cn
http://UZd2eiCh.ztnmc.cn
http://76GTNhHF.ztnmc.cn
http://hbwsaUZV.ztnmc.cn
http://PcxwaEGx.ztnmc.cn
http://ylKRC9am.ztnmc.cn
http://mUn9rftd.ztnmc.cn
http://mqGdleAP.ztnmc.cn
http://X5d1fFxT.ztnmc.cn
http://kk3oFidH.ztnmc.cn
http://gWoYzSRh.ztnmc.cn
http://1CFGpx9z.ztnmc.cn
http://4KhMs4XR.ztnmc.cn
http://rRoM8qGt.ztnmc.cn
http://tx9XZd57.ztnmc.cn
http://xJa1l0zN.ztnmc.cn
http://8IiIjL8N.ztnmc.cn
http://7DpmshA2.ztnmc.cn
http://RlU3ItSm.ztnmc.cn
http://GJ54O3cb.ztnmc.cn
http://tv3ScyhO.ztnmc.cn
http://cCedHEgY.ztnmc.cn
http://mMKitBxS.ztnmc.cn
http://GzUz2GLp.ztnmc.cn
http://Tp3z6Alb.ztnmc.cn
http://etVtL44g.ztnmc.cn
http://C42uDjFG.ztnmc.cn
http://www.dtcms.com/a/379265.html

相关文章:

  • 项目中遇到pom文件里使用systemPath的例子记录
  • pycharm——关于Pyqt5
  • Qwen3 中旋转位置编码
  • vue3项目sass全局变量的设置和使用
  • 透彻理解Python环境管理:虚拟环境、Conda、Pyenv和Pipx为何而生
  • 【unity实战】实现在unity3D模型上画线写字涂鸦效果
  • 2025最新超详细FreeRTOS入门教程:第十三章 FreeRTOS临界区与原子操作
  • 玩转Docker | 使用Docker部署dufs文件管理工具
  • 计算机组成原理:定点乘法运算
  • PyQt5 主窗口状态栏实时显示当前路径的实现与分析
  • 利用conda打包/复刻生信环境
  • glide介绍
  • vscode 中通义灵码显示登录过期
  • 【VScode】ssh报错
  • STM32 norflash W25Q64移植FatFS
  • 【Git】版本控制-Gitee
  • Qt常见问题
  • 泛函Φ(u)驻点的方程与边界条件 / 求给定泛函驻点满足的方程及边界条件
  • 统一权限管理平台登录不了怎么办?
  • 中级统计师-统计法规-第四章 统计管理体制
  • java反射(详细教程)
  • 【Leetcode】高频SQL基础题--1327.查找拥有有效邮箱的用户
  • Redis(集群)
  • 吾爱小工具!一键屏蔽流氓软件!
  • 告别网络监控“盲区”!OpManager全新升级解锁轻量监控新纪元!
  • 实验室试管架 | 塑料、金属等多种材质与规格 | 支持多种试管尺寸 | Sigma-Aldrich
  • .net 类库生成的DLL源码混淆加密
  • 北京-测试-入职金融公司第四周-加班&未发现bug
  • Story2Board: A Training-Free Approach for Expressive Storyboard Generation论文
  • 纯`css`轻松防止滚动穿透