Redis集合[持续更新]

server/2024/11/30 2:26:37/

Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。

数据结构

1. string 字符串

字符串类型是 Redis 最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的。字符串类型实际上可以是字符串:简单的字符串、XML、JSON;数字:整数、浮点数;二进制:图片、音频、视频。

使用场景:缓存、计数器、共享 Session、限速。

2. Hash(哈希)

在 Redis中哈希类型是指键本身是一种键值对结构,如 value={{field1,value1},……{fieldN,valueN}}

使用场景:哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。所以常常用于用户信息等管理,但是哈希类型和关系型数据库有所不同,哈希类型是稀疏的,而关系型数据库是完全结构化的,关系型数据库可以做复杂的关系查询,而 Redis 去模拟关系型复杂查询开发困难且维护成本高。

3. List(列表)

列表类型是用来储存多个有序的字符串,列表中的每个字符串成为元素,一个列表最多可以储存 2 ^ 32 – 1 个元素,在 Redis 中,可以队列表两端插入和弹出,还可以获取指定范围的元素列表、获取指定索引下的元素等,列表是一种比较灵活的数据结构,它可以充当栈和队列的角色。

使用场景:Redis 的 lpush + brpop 命令组合即可实现阻塞队列,生产者客户端是用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。

image-20210608011814007

4. Set(集合)

集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中不允许有重复的元素,并且集合中的元素是无序的,不能通过索引下标获取元素,Redis 除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集。合理的使用好集合类型,能在实际开发中解决很多实际问题。

使用场景:如:一个用户对娱乐、体育比较感兴趣,另一个可能对新闻感兴趣,这些兴趣就是标签,有了这些数据就可以得到同一标签的人,以及用户的共同爱好的标签,这些数据对于用户体验以及曾强用户粘度比较重要。

5. zset(sorted set:有序集合)

有序集合和集合有着必然的联系,它保留了集合不能有重复成员的特性,但不同得是,有序集合中的元素是可以排序的,但是它和列表的使用索引下标作为排序依据不同的是:它给每个元素设置一个分数,作为排序的依据。

使用场景:排行榜是有序集合经典的使用场景。例如:视频网站需要对用户上传的文件做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。

缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

形成原因:

  • 业务代码或数据出现问题,比如读写key不一致

  • 网络爬虫或恶意攻击

解决方法:

  • 缓存空对象:对于查询不到的数据给它设置一个空值进行缓存

    带来的问题:

    1、需要更多的内存空间,比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。这种方法使用与数据经常变化,实时性较高的场景。

    2、缓存和存储的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如:过期时间设置为 5分钟,如果此时存储添加了这个数据,那此段时间就会出现缓存和存储数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。
  • 布隆过滤器拦截:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。这种方法适用于数据命中不高、数据相对固定、实时性低的应用场景,代码维护较为复杂,但是缓存空间占用少。

缓存击穿

某个key成为一个热点(如商品秒杀)时,这样处于一个集中式高并发的情况下,如果key突然失效一瞬间,请求就会马上击穿缓存层,直接请求数据库,这样后端负载会很快过载甚至崩溃。

解决办法:

1,根据实际情况设置二级缓存或者热点缓存永不过期。

2,设置分布式互斥锁,只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获取数据

缓存雪崩

缓存层由于某些原因不可用(宕机)或者大量缓存由于超时时间相同在同一时间段失效(大批key失效/热点数据失效),大量请求直接到达存储层,存储层压力过大导致系统雪崩。

解决办法:

  1. 设置多级缓存,不同的缓存设置不同的过期时间。
  2. 加锁排队:在缓存失效后,通过加锁或者队列来控制读数据库缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待;
  3. 数据预热:可以通过缓存 reload 机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀;
  4. 缓存层设计为高可用,例如使用sentinel哨兵模式或者cluster,这样即使个别节点或机器宕机也不会影响缓存效果实现。
  5. 缓存的过期时间设置随机分布的,避免在同一时间内缓存集体失效。

持久化

RDB

RDB 是 Redis DataBase 的缩写。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。即 Snapshot 快照存储,对应产生的数据文件为 dump.rdb,通过配置文件中的 save 参数来定义快照的周期。核心函数:rdbSave(生成 RDB 文件)和 rdbLoad(从文件加载内存)两个函数。

image-20210608012429690

AOF

AOF 是 Append-only file 的缩写。Redis会将每一个收到的写命令都通过 Write 函数追加到文件最后,类似于 MySQL 的 binlog。当 Redis 重启是会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。每当执行服务器(定时)任务或者函数时,flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作:

  • WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件;
  • SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。

image-20210608012457207

RDB 和 AOF 的区别:

  1. AOF 文件比 RDB 更新频率高,优先使用 AOF 还原数据;

  2. AOF比 RDB 更安全也更大;

  3. RDB 性能比 AOF 好;

  4. 如果两个都配了优先加载 AOF。

Redis zset底层实现,跳表查询数据的流程,如何拿到元素的分数值:

Redis 中的有序集合(Sorted Set)使用跳表(Skip List)作为底层实现。

跳表是一种有序的数据结构,类似于多级索引,可以实现快速的查找、插入和删除操作。

在跳表中,每个节点包含一个键值对(元素值和分数值),并且每个节点都包含多个指向下一个节点的指针,这些指针跨越多个级别。

查询数据的流程是从最高级别开始,逐级向下查找,直到找到目标元素或者确定目标元素不存在。

要获取元素的分数值,可以通过指定元素的键值来获取其分数值。

Redis主从复制流程,offset的作用,rdb文件的结构:

Redis 主从复制是指从一个 Redis 服务器(主服务器)复制数据到另一个 Redis 服务器(从服务器)的过程。

主从复制的流程分为三个阶段:

  1. 同步阶段: 从服务器连接到主服务器,并发送同步命令,主服务器开始将数据发送给从服务器。
  2. 复制阶段: 主服务器将数据库中的数据发送给从服务器,从服务器将数据保存到自己的内存中。
  3. 命令传播阶段: 主服务器将接收到的写命令发送给从服务器,从服务器执行相同的写命令,保持主从数据一致。

在主从复制中,offset 是指从服务器在复制过程中已经复制的字节数,用于记录从服务器已经接收到的数据位置,以便在断开连接后可以快速恢复。

RDB 文件是 Redis 数据持久化的一种方式,它保存了 Redis 在某个时间点的数据快照。RDB 文件的结构包括文件头、数据类型、键值对等信息

保证消息顺序性

对于 RabbitMQ 或类似的消息队列系统,可以通过以下方式来保证消息的顺序性:

  • 使用单个队列:将所有相关消息发送到同一个队列,这样就能保证它们按照发送的顺序被消费。
  • 使用单个消费者:在消费端只使用一个消费者来消费消息,这样可以确保消息按顺序被处理。
  • 使用消息序列号:在消息体中添加序列号,消费者在处理消息时按照序列号顺序进行处理。
  • 使用分区键:如果必须使用多个队列或多个消费者,可以根据消息的某个属性(如用户ID)进行分区,保证同一分区内的消息被顺序处理。

http://www.ppmy.cn/server/15039.html

相关文章

前端三剑客 HTML+CSS+JavaScript ④ HTML标签

祝你先于春天,翻过此间铮铮山峦 —— 24.4.23 一、HTML排版标签 1.标题标签 h1~h6 标签含义:标题 单/双标签:双 主要用前三个 2.段落标签 p 标签含义:段落 单/双标签:双 3.div 没有任何含…

【深度学习】DragGAN

基于StyleGAN的图像拖拽编辑新范式 一、StyleGAN与DragGAN:图像生成与编辑的桥梁二、DragGAN的实现原理三、实例与代码展示四、总结与展望 在深度学习和计算机视觉领域,图像生成和编辑技术一直是研究的热点。StyleGAN作为一种强大的图像生成模型&#xf…

【论文精读】Attention is all you need

摘要 主要的序列转换模型是基于复杂的循环或卷积神经网络,其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意力机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构,Transformer,完全基于注意机制,完全…

算法 - 递归 数学分析 - 2335. 装满杯子需要的最短总时长 详细解析

2335. 装满杯子需要的最短总时长 文章目录 [2335. 装满杯子需要的最短总时长](https://leetcode.cn/problems/minimum-amount-of-time-to-fill-cups/description/)说明题解思路简单模拟 递归数学分析 Code简单模拟 递归数学分析 说明 现有一台饮水机,可以制备冷水…

亚远景科技-ASPICE评估师等级、ASPICE评估师培训和ASPICE评估项目等级简介

1. ASPICE评估师等级: ASPICE评估师等级主要包括助理评估师、主任评估师、首席评估师和评估师导师。这些等级反映了评估师在执行ASPICE评估项目时的经验和专业能力。助理评估师即小PA,主任评估师即CA,首席评估师即大PA。每一个等级都需要经过严格的培训…

arm版Linux下安装大数据集群各种组件

背景:由于本人是用的Macbookpro m2来进行开发的,很多环境和Intel芯片的都不一样,期间安装各种软件遇到各种问题,为了以后不走之前的老路,现记录各种软件的安装步骤。 系统安装组件说明 序号组件名称组件版本1jdkjdk-…

web开发

在读本篇文章之前,读者应具备javaSE的基础知识,前端网页的基本知识(能制作简单样式即可)。 所谓web开发,指的就是从网页向后端程序发送请求,后端做出响应,即前端与后端程序进行交互。 那么前端…

JAVA每日面试题(一)

Java高级面试问题及答案 问题1: 请解释Java中的强引用、软引用、弱引用和虚引用,并给出使用场景 答案: 强引用:Java中最常见的引用类型,如果一个对象具有强引用,那么它永远不会被垃圾回收器回收,直到这个…