Redis总结(官方文档解读)

定义

      Redis是一个开源的,基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。

特征

  • 高性能

  • 支持丰富的数据类型

  • 丰富的操作类型,操作是原子性的

  • 支持周期性持久化

  • 支持分布式

  • 开源免费,社区活跃

数据类型

数据类型

解释

使用场景

基本命令

string

最简单的值类型。字符串存储字节序列,包括文本、序列化对象和二进制数组。单个Redis 字符串最大可以为512MB

hash

Redis 哈希是一种记录类型,其结构为字段值对的集合。

list

Redis 列表是字符串值的链接列表

set

Redis 集合是唯一字符串(成员)的无序集合

zset

Redis 有序集是按相关分数排序的唯一字符串(成员)的集合。当多个字符串具有相同的分数时,这些字符串将按字典顺序排序

Stream

Redis Stream 是 Redis 5.0 版本引入的一种新的数据结构,Redis 可为每个流条目生成一个唯一 ID,用于实现消息队列的功能。Stream 是一种有序的、可持久化的数据结构,可以用来存储多个字段和值对的消息记录。

Bitmap

位图不是实际的数据类型,而是一组定义在字符串类型上的面向位的操作,该字符串被视为位向量。由于字符串是二进制安全的 blob,其最大长度为 512 MB,因此它们适合设置最多 2^32 个不同的位。

Bitfield

Redis 位域允许您设置、递增和获取任意位长度的整数值。

这些值使用二进制编码的 Redis 字符串存储。位字段支持原子读取、写入和增量操作。

Geospatial

Redis 地理空间索引可让您存储坐标并搜索它们。

  • 查找给定半径或边界框内的附近点

过期策略

  • 惰性删除。查询key 的时候才对key进行检测。若key已经过期则删除,若key没有过期则返回。缺点是如果过期的key 一直没有被访问,则会一直无法被删除,存在于内存中。

  • 定期删除。redis 每隔一段时间对数据库做一次检查,删除里面过期的key。由于不可能对所有key 做轮询,所以redis 会每次随机选取一些key 做检查和删除。

  • 内存淘汰机制

    • volatile-lru:针对设置了过期时间的key,使用lru(最近很少使用)算法进行淘汰

    • allkeys-lru:针对所有key 使用lru算法进行淘汰

    • volatile-lfu:针对设置了过期时间的key,使用lfu(最近不经常使用)算法进行淘汰

    • allkeys-lfu:针对所有key 使用lfu 算法进行淘汰

    • volatile-random:从所有设置了过期时间的key 中使用随机淘汰方式进行淘汰

    • allkeys-random:针对所有的key 使用随机淘汰机制进行淘汰

    • volatile-ttl:针对设置了过期时间的key,越早过期的越先被淘汰

    • noeviction:不会淘汰任何数据,当使用的内存空间超过maxmemory是时,再有写请求来时返回错误

持久化方案

 Redis 提供了一系列持久性选项包括:

  • RDB(Redis 数据库):RDB 持久性会按照指定的时间间隔对数据集执行时间点快照。

  • AOF(仅追加文件):AOF 持久性记录服务器收到的每个写入操作。然后可以在服务器启动时再次重放这些操作,重建原始数据集。命令使用与Redis 协议本身相同的格式进行记录。

  • 无持久性:您可以完全禁用持久性。这有时在缓存时使用。

  • RDB + AOF:您还可以在同一实例中结合使用AOF 和RDB

RDB

  • 优点

    • RDB 是 Redis 数据的一个非常紧凑的单文件时间点表示。RDB 文件非常适合备份。例如,您可能希望每小时存档最近 24 小时内的 RDB 文件,并每天保存 30 天的 RDB 快照。这样,您就可以在发生灾难时轻松恢复数据集的不同版本。

    • RDB 非常适合灾难恢复,它是一个单一的紧凑文件,可以传输到远程数据中心,或者传输到 Amazon S3(可能加密)。

    • RDB 可最大程度地提高 Redis 的性能,因为 Redis 父进程为了持久化所需要做的唯一工作就是派生一个子进程,然后由子进程来完成其余所有工作。父进程永远不会执行磁盘 I/O 或类似操作。

    • 与 AOF 相比,RDB 允许使用大数据集更快地重启

    • 在副本上,RDB 支持重启和故障转移后的部分重新同步。

  • 缺点

    • 如果您需要尽量减少 Redis 停止工作(例如断电后)时数据丢失的可能性,那么 RDB 并不是一个好选择。您可以配置生成 RDB 的不同保存点(例如,在至少五分钟后对数据集进行 100 次写入后,您可以有多个保存点)。但是,您通常每五分钟或更长时间创建一个 RDB 快照,因此,如果 Redis 因任何原因而未正确关闭而停止工作,您应该准备好丢失最近几分钟的数据。

    • RDB 需要经常使用子进程 fork() 才能将其持久保存在磁盘上。如果数据集很大,fork() 可能会很耗时,如果数据集很大且 CPU 性能不佳,可能会导致 Redis 停止为客户端提供服务几毫秒甚至一秒钟。AOF 也需要 fork(),但频率较低,您可以调整重写日志的频率,而无需牺牲持久性。

AOF

  • 优点

    • 使用 AOF Redis 的持久性更强:您可以采用不同的 fsync 策略:完全不进行 fsync、每秒进行 fsync、每次查询时进行 fsync。使用每秒进行 fsync 的默认策略,写入性能仍然很好。fsync 使用后台线程执行,主线程会在没有 fsync 进行时尽力执行写入,因此您只会丢失一秒钟的写入。

    • AOF 日志是仅附加日志,因此不会出现寻道,也不会在断电时出现损坏问题。即使日志因某种原因(磁盘已满或其他原因)以半写命令结束,redis-check-aof 工具也能够轻松修复它。

    • 当 AOF 太大时,Redis 能够在后台自动重写。重写是完全安全的,因为 Redis 在继续向旧文件追加内容的同时,会使用创建当前数据集所需的最少操作集生成一个全新的文件,并且一旦第二个文件准备就绪,Redis 就会切换这两个文件并开始向新文件追加内容。

    • AOF 以易于理解和解析的格式逐一记录所有操作的日志。您甚至可以轻松导出 AOF 文件。例如,即使您不小心使用该FLUSHALL命令刷新了所有内容,只要在此期间没有执行日志重写,您仍然可以通过停止服务器、删除最新命令并重新启动 Redis 来保存数据集。

  • 缺点

    • 对于同一数据集,AOF 文件通常比等效的 RDB 文件更大

    • 根据确切的 fsync 策略,AOF 可能比 RDB 慢。一般来说,将 fsync 设置为每秒一次时,性能仍然非常高,而禁用 fsync 时,即使在高负载下,它也应该与 RDB 一样快。即使在写入负载巨大的情况下,RDB 仍能够提供更多关于最大延迟的保证。

RDB/AOF 对比

-

RDB

AOF

说明

把当前内存中的数据集快照写入磁盘。恢复时是将快照文件直接读到内存里。

通过持续不断的保存Redis 服务器所执行的更新命令来记录数据库状态,类似mysql 的 binlog。恢复数据时要从头开始回放更新命令

磁盘刷新频率

文件大小

数据恢复效率

数据安全

分布式方案

分片方案

客户端分片

将分片工作放在业务程序端。不依赖于第三方分布式中间件,实现方法和代码可控,对开发人员要求高。

代理分片

将分片工作交给专门的代理程序来做,运维方案。代表:Twemproxy,Codis

服务器分片

Redis Cluster 将所有key映射到16384个slot 中,集群中每个redis 实例负责一部分,业务程序通过集成的redis cluster 客户端进行操作

主从复制

        主从复制是redis 最基本、最常用的同步方式。它的原理是将主节点的数据复制到从节点,使得从节点的数据与主节点保持一致。主从复制是异步的,从节点与主节点的数据不是实时同步的。如果主节点发生故障,从节点可能会因为数据延迟而出现数据丢失的情况。

集群模式

        Redis集群是Redis提供的分布式数据库方案,它将数据分散在多个节点上,每个节点都包含整个数据集的一部分。Redis集群通过分片来分布数据,每个节点负责数据集的一个片段。集群中的每个分片都可以有一个或多个从节点,用于故障转移和高可用性。

哨兵模式

        除了主从复制外,Redis 还提供了哨兵模式作为高可用性解决方案。哨兵模式可以自动检测主节点的状态。当主节点发生故障时,会自动将一个从节点切换为主节点。切换过程中,从节点会先将自己的数据与主节点保持一致,然后才能成为新的主节点。因此,在哨兵模式下,数据同步的过程与主从复制类似,但是其实现方式更加自动化。

缓存方案

        redis 用作缓存组件时,其基于内存的读写特性,比基于磁盘读写的数据库性能要高很多,适合缓存高频热点的数据,来提高读性能。这样可以降低对数据库服务器的查询请求,提高系统性能。

数据一致性

读写步骤

        在使用缓存与数据库保持一致性的场景中,通常遵循以下读写步骤来确保数据的一致性。

  • 读取操作:

  1. 检查缓存:客户端发起读取请求时,首先在缓存中查找所需数据。

  1. 缓存命中:如果缓存中有数据(缓存命中),则直接返回缓存中的数据给客户端。

  2. 缓存未命中:

    1. 如果缓存中没有数据(缓存未命中),则从数据库中读取数据。

    2. 将从数据库中读取的数据写入缓存,以便下次可以直接从缓存中读取。

    3. 返回数据库中的数据给客户端。

  • 写入操作:

  1. 更新数据库:客户端发起写入请求时,首先更新数据库中的数据。

  2. 失效缓存:在数据库更新成功后,立即使缓存中的相关数据失效或更新缓存中的数据。这样可以确保下次读取操作时,客户端能够从数据库中获取最新的数据。

分布式锁
  • 使用分布式锁来保证在更新数据库和失效缓存的过程中,不会有其他并发操作干扰。
读写串行化
  • 通过队列等机制,确保对同一数据的读写操作不会并发执行。
订阅数据库变更
  • 通过订阅数据库的变更日志(如 MySQL 的 Binlog),在数据变更时自动更新或失效缓存。

缓存异常

缓存穿透
  • 定义

    • 缓存穿透是指查询一个一定不存在的数据,由于缓存中不存在该数据,每次请求都会落到数据库上,从而可能导致数据库压力过大甚至崩溃。

  • 造成原因

    • 恶意攻击,造成大量访问不存在的key

  • 解决方案

    • 缓存空对象:对于查询结果为空的键,也将其存入缓存,并设置一个较短的过期时间。这样,即使是不存在的数据也会被缓存,从而避免频繁查询数据库。

    • 布隆过滤器:在访问缓存之前,使用布隆过滤器检查数据是否可能存在。如果布隆过滤器判断数据不存在,则直接返回,不查询缓存和数据库。

    • 接口限流:对于访问频率极高的请求,可以使用接口限流来防止恶意攻击。

    • 安全性检查:应用程序检查key的合法性,提前拒绝不合法请求;检查请求来源IP,限制访问次数,或设置黑名单。

          

缓存雪崩
  • 定义

    • 缓存雪崩是指缓存中大量数据同时过期或者缓存服务突然宕机,导致大量请求直接落到数据库上,引起数据库压力骤增,甚至导致数据库崩溃。

  • 造成原因

    • redis故障、比如redis 宕机

    • 网络出现抖动

  • 解决方案

    • 设置不同的过期时间:为缓存数据设置不同的过期时间,避免大量数据同时过期。

    • 使用持久化缓存:比如Redis的RDB或AOF持久化功能,即使服务重启,也能快速恢复缓存数据。

    • 服务熔断和限流:在缓存失效或者服务故障时,通过服务熔断和限流来保护后端系统。

    • 多级缓存:构建多级缓存架构,例如本地缓存+分布式缓存,即使分布式缓存出现问题,本地缓存仍能提供一定的保护。

缓存击穿
  • 定义

    • 缓存击穿是指某个热点数据在缓存中过期,而此时大量并发请求访问该数据,导致这些请求都落到数据库上,从而可能引起数据库压力过大。

  • 造成原因

    • 热点key 设置了太短的过期时间

  • 解决方案

    • 热点数据永不过期:对于热点数据,可以设置永不过期或者过期时间非常长。

    • 互斥锁:在缓存失效时,通过互斥锁来保证同一时间只有一个请求去查询数据库,并更新缓存,其他请求等待缓存更新完成后再返回数据。

    • 数据热加载:使用后台线程或者定时任务,预先加载热点数据至缓存中。

Redis 使用Lua 脚本

        Redis 允许用户在服务器上上传和执行 Lua 脚本。脚本可以使用编程控制结构,并在执行时使用大多数命令来访问数据库。由于脚本在服务器中执行,因此从脚本读取和写入数据非常高效。

Redis 事务

        Redis 中的事务处理是通过 MULTIEXECDISCARD 和 WATCH 命令来实现的。Redis 的事务允许一组命令在单个步骤中按顺序执行,确保这些命令作为一个单独的操作被处理。

  • 以下是 Redis 事务处理的关键点

    • 事务中的所有命令都是序列化的,并按顺序执行

    • 在 Redis 事务执行过程中,其他客户端发送的请求永远不会得到处理。这保证了命令作为单个隔离操作执行。

  • 命令

    • MULTI

      • MULTI 命令用于开始一个事务。在发出 MULTI 命令后,客户端可以发出多个命令,这些命令不会立即被执行,而是被放入一个队列中。

    • ​​​​​​​EXEC

      • MULTI 命令之后,你可以发送多个命令到队列中。当所有的命令都添加到事务队列后,使用 EXEC 命令来执行所有队列中的命令。

    • ​​​​​​​DISCARD

      • 如果你在执行事务之前改变主意,可以使用 DISCARD 命令来取消事务,并丢弃事务队列中的所有命令。

    • ​​​​​​​WATCH

      • 在事务开始之前,你可以使用 WATCH 命令来监控一个或多个键。如果在事务执行前这些键被修改(通过其他客户端),则 EXEC 命令将不会执行事务中的任何命令,而是返回一个空回复。这种机制可以用作乐观锁。

  • 注意事项

        Redis 事务不支持回滚,如果事务中的某个命令执行失败,那么事务中的其他命令仍然会执行。

Redis 发布/订阅

        Redis 的发布/订阅(Publish/Subscribe)模式是一种消息传递范式,允许客户端订阅一个或多个频道(channel),并接收来自这些频道的消息。在这种模式中,发送者(发布者)发布消息到一个频道,而接收者(订阅者)监听这个频道以接收消息。

  • 基本概念

    • 发布者(Publisher):发布消息到频道。

    • 订阅者(Subscriber):订阅一个或多个频道,以接收来自这些频道的消息。

    • 频道(Channel):消息传递的通道,发布者和订阅者通过频道进行消息的发送和接收。

  • 常用命令

    • SUBSCRIBE:订阅一个或多个频道。

      • SUBSCRIBE channel [channel ...]

    • ​​​​​​​UNSUBSCRIBE: 退订一个或多个频道。

      • UNSUBSCRIBE [channel [channel ...]]

    • ​​​​​​​PUBLISH:向指定频道发送消息。

      • PUBLISH channel message

    • ​​​​​​​PSUBSCRIBE:订阅一个或多个符合给定模式的频道。

      • PSUBSCRIBE pattern [pattern ...]

    • ​​​​​​​PUNSUBSCRIBE:退订一个或多个符合给定模式的频道。

      • PUNSUBSCRIBE [pattern [pattern ...]]

  • 注意事项

    • 发布/订阅消息是异步的,发布者不会知道消息是否被成功接收。

    • 如果没有订阅者监听某个频道,那么向该频道发布的消息将不会被任何人接收。

    • 订阅者在订阅频道时处于阻塞状态,只能接收消息或通过退订来退出阻塞状态。

    • 发布/订阅模式不支持消息持久化,如果 Redis 服务重启,所有订阅信息和发布过的消息都会丢失。

比较

Redis 与 Mysql 的区别

Redis 与 Memcache 的区别

参考文献

Redis 官方文档:Develop with Redis | Docs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/891059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基础篇:带你打开Vue的大门(一)

学习目标: 理解Vue的基本概念:掌握Vue.js是什么,它的设计理念,以及它在现代Web开发中的应用。掌握Vue的基本语法:学习Vue的基础指令和语法,能够使用Vue构建简单的交互式界面。熟悉Vue组件化开发&#xff1…

vue3--通用 popover 气泡卡片组件实现

背景 在日常开发中,我们一般都是利用一些诸如:element-ui、element-plus、ant-design等组件库去做我们的页面或者系统 这些对于一些后台管理系统来说是最好的选择,因为后台管理系统其实都是大同小异的,包括功能、布局结构等 但是对于前台项目,比如官网、门户网站这些 …

【银行科技岗】相关考试知识点总结及部分考题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、**网络与安全**二、**软件开发与设计**三、**数据库与数据管理**四、**编程与系统**五、**计算机硬件与性能**六、**大数据与人工智能**七、**系统与应用**相关…

人型机器人技术及前景详解

随着科技的飞速发展,人型机器人作为人工智能领域的一个重要分支,正逐步走进我们的生活和工作之中。它们不仅在外形上模拟人类,更在感知、决策、行为和交互能力上展现出强大潜力。本文将深入探讨人型机器人的技术原理、当前发展状况以及未来的…

数据结构-排序2

1.快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为: 任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子…

interwirelessac9560感叹号,电脑无法连接wifi,无法搜索到wifi

interwirelessac9560感叹号 电脑无法连接wifi,无法搜索到wifi 原因 这可能是wifl模块出现了问题。 解决方案 1、winx 打开,选择【设备管理器】 2、选择网络适配器 右键打开wireless-AC,选择【卸载设备】。 3、关机2分钟后&#xff0c…

【CSS】纯css3螺旋状loading加载特效

效果图 <div class"ai-loader"><div class"dot"></div><div class"dot"></div><div class"dot"></div><div class"dot"></div><div class"dot">&…

C语言复习概要(六)

公主请阅 1. 深入理解数组与指针在C语言中的应用1.1 数组名的理解 2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序的实现5. 二级指针6. 指针数组7. 指针数组模拟二维数组8.总结 1. 深入理解数组与指针在C语言中的应用 数组与指针是C语言的核心概念之一&#xff0c;理解…

【安装JDK和Android SDK】

安装JDK和Android SDK 1 前言2 下载2.1 下载途径2.2 JDK下载和安装2.2.1 下载2.2.2 安装并配置环境变量2.2.3 验证 2.3 SDK下载和安装2.3.1 下载2.3.2 安装2.3.3 环境变量配置2.3.4 验证 1 前言 在软件开发中&#xff0c;Android应用开发通常使用Android Studio&#xff0c;但…

使用Milvus和Llama-agents构建更强大的Agent系统

代理&#xff08;Agent&#xff09;系统能够帮助开发人员创建智能的自主系统&#xff0c;因此变得越来越流行。大语言模型&#xff08;LLM&#xff09;能够遵循各种指令&#xff0c;是管理 Agent 的理想选择&#xff0c;在许多场景中帮助我们尽可能减少人工干预、处理更多复杂任…

typescript使用webpack打包编译问题

解决方案&#xff1a;在webpack.config.js中的mdule.exports中设置mode。 再次运行npm run start即可。

【软考】设计模式之中介者模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点 1. 说明 1.用一个中介对象来封装一系列的对象交互。2.中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。3.中介者模式&#xff08;Mediator Pattern&…

Copilot Coaching新功能铸就Word更强

Copilot 的意思是副驾驶。 现在&#xff0c;您的副驾驶教练来了&#xff1a;Copilot Coaching Copilot Coaching 是 Word 中的一项新 Copilot 功能&#xff0c;可在您查看内容时为您提供支持&#xff0c;以实现语法和拼写之外的改进 - 帮助您澄清想法&#xff0c;并为您提供有…

【优选算法】(第四十篇)

目录 岛屿数量&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 岛屿的最⼤⾯积&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 岛屿数量&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;LeetCo…

植物大战僵尸杂交版

最新版植物大战僵尸杂交版 最近本款游戏火爆 下载资源如下&#xff1a; win版本&#xff1a;2.3.7 链接&#xff1a;下载地址 提取码&#xff1a;9N3P Mac&#xff08;苹果版本&#xff09;&#xff1a;2.0.0 链接&#xff1a;下载地址 提取码&#xff1a;Bjaa 介绍&#xff…

【论文#码率控制】ADAPTIVE RATE CONTROL FOR H.264

目录 摘要1.前言2.基本知识2.1 蛋鸡悖论2.2 基本单元的定义2.3 线性MAD预测模型 3.GOP级码率控制3.1 总比特数3.2 初始化量化参数 4.帧级码率控制4.1 非存储图像的量化参数4.2 存储图像的目标比特 5.基本单元级码率控制6.实验结果7.结论 《ADAPTIVE RATE CONTROL FOR H.264》 A…

考研编程:10.11 回文数 水仙花 生成一定范围内的随机数 求二叉树宽度

回文数 #include <stdio.h>int main(){int a,b,c0,sum;scanf("%d",&a);ba;while(b!0){c b%10 c*10;b b/10;}if(ca){printf("yes");}return 0; } 水仙花 #include <stdio.h> #include <math.h> int main(){int a,b,c0,sum;scan…

网络协议原理

文章目录 TCP通信原理TCP与UDP的对比应用层应用层协议 --- tcp协议定制直接传递对象自定义协议现在要解决的问题业务处理 json的使用使用json进行序列化和反序列化操作 总结 TCP通信原理 tcp是面向字节流的 同时他也是面向连接的 所以TCP的服务器编写代码如图所示: 客户端的编…

C语言:在Visual Studio中使用C语言scanf输入%s出现的栈溢出问题

学了C之后就很少使用C语言了&#xff0c;今天帮同学解答C语言问题&#xff0c;遇到了一个我以前没有遇到过的问题。 一、问题描述 先看以下代码&#xff1a; #include<stdio.h> int main() {char str[100] { 0 };scanf_s("%s", str);printf("%s",…

探索极简计算的新边界:从Uxn虚拟机看未来编程生态

越来越多的开发者追求复杂度和功能性的极致,然而,有一个小众的编程社区选择了截然不同的道路——极简主义。Uxn虚拟机便是这一思潮的代表之一。它通过简洁的指令集和有限的硬件资源模拟,试图打造一种可以在多种设备上运行的便携性编程环境。 与主流的重型操作系统和复杂…