redis的持久化机制

1.redis为什么需要持久化

  • redis本身运行时数据保存在内存中,那么在关闭redis的进程或者关闭计算机后数据肯定被会操作系统从内存中清掉。

  • redis持久化方式有两种:

    • RDB

    • AOF

  • redis默认采用了一种持久化方式,即RDB (Redis DataBase)

2. redis的RDB持久化方式

1. 什么是RDB
  • 指定的时间间隔内将内存中的数据集快照写入磁盘(持久化数据到磁盘),也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里

  • Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

2. rdb配置文件说明
低版本save 900 1  #如果至少执行了1个更改,则在900秒(15分钟)后同步save 300 10 #如果至少执行了10个更改,则在300秒(5分钟)后同步save 60 10000 #如果至少执行了10000个更改,则将在60秒后同步
高版本save 3600 1 300 100 60 10000或者save 3600 1 #如果至少进行了1个更改,则在3600秒(1小时)之后同步save 300 100 #如果至少执行了100个更改,则在300秒(5分钟)之后同步save 60 10000 #如果至少执行了10000个更改,则在60秒后同步
dbfilename dump.rdb #快照的文件名
​dir ./ #快照文件的存放路径
  • 如果注释掉了save,并且没有开启aof持久化,使用的是redis的RDB默认持久化方案。

  • 如果有重要的数据写进来 需要立即生成快照 使用 save / bgsave命令

Save:save时只管保存,其它不管,全部阻塞
 
BGSAVE:Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。
可以通过lastsave命令获取最后一次成功执行快照的时间
  • 执行flushall命令,会把redis缓存的数据清空,也会产生dump.rdb文件,但里面是没有存储任何数据,无意义。

  • 当我们执行 shutdown命令时直接生成一个dump.rdb文件,将数据持久化

  • 但是如果是非正常关闭redis服务,是不会持久化数据的,会导致最后一次快照 和 意外down掉之间的写的数据都会丢失。

  • 恢复数据只需要往dump.rdb文件移动到redis安装启动目录即可,可以通过config get dir命令去获取安装启动目录

3. RDB的操作
  • 修改配置文件中的参数 需要重启redis服务,才能起作用

AOF的持久化

1.1.1. 什么是AOF持久化
  • 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录)

  • 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据。

  • redis重启的话就根据日志文件的内容将指令从前到后执行一次以完成数据的恢复工作

1.1.2. AOF配置文件的说明

启动AOF配置就需要将RDB配置禁掉。

appendonly yes #启用aof
​
appendfilename "appendonly.aof"  #aof的文件名称
​
# appendfsync always
appendfsync everysec #aof的默认策略
# appendfsync no
  • 先把rdb策略禁掉

  • appendonly no 改为 appendonly yes 启用aof的持久化

  • appendfilename "appendonly.aof" 记录写操作的文件

  • 如果appendonly.aof文件出问题了,修复 appendonly.aof 使用 ./redis-check-aof --fix appendonly.aof

1.1.3. AOF的操作

1.2. RDB和AOF的总结(重要)

1.2.1. RDB的优点
  • RDB文件是紧凑的二进制文件,比较适合做冷备(冷备是指两个服务器,一台运行,一台不运行做为备份,这样一旦运行的服务器宕机,就把备份的服务器运行起来。),全量复制的场景。

  • 相对于AOF持久化机制来说,直接基于RDB数据文件来重启和恢复Redis进程,更加快速;

  • RDB每次写,都是直接写Redis内存,只是在一定的时候,才会将数据写入磁盘中;

  • RDB使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了Redis的高性能

1.2.2. RDB的缺点
  • 如果想要在Redis故障时,尽可能少的丢失数据,那么RDB没有AOF好

  • RDB每次在fork(创建)子进程来执行RDB快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,或者甚至数秒;

  • RDB无法实现实时或者秒级持久化

1.2.3. AOF的优点
  • AOF可以更好的保护数据不丢失

  • AOF日志文件以append-only模式写入,写入性能比较高

  • AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。

  • 适合做灾难性的误删除紧急恢复

1.2.4. AOF的缺点
  • 对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大,恢复速度慢

  • AOF开启后,支持的写QPS(每秒查询率)会比RDB支持的写QPS低

1.2.5. 应用场景
  • 对数据非常敏感,建议使用默认的AOF持久化方案,比如购物车数据

  • 数据呈现阶段有效性,能接受一段时间的缓存丢失,建议使用RDB持久化方案,比如新闻列表页面最新的新闻列表、大数据量的备份恢复(冷备)

1.2.6. redis使用准则

redis不可以一次性存储海量数据,只适用于较少数据的场景。

redis存储数据时一般都要设置有效期。

2.redis事务机制

支持事务,但是不支持强事务。

通过三个命令

multi  标记事务开始
命令入队
exec 执行事务      discard 取消作废事务

mysql事务:将一个事务的很多操作,作为一个系列操作,这个系列的操作要么都成功,要么都失败。

ACID : 原子性、一致性、隔离性、持久性。

2.1. 什么是redis的事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证

  • 批量操作在发送 EXEC 命令前被放入队列缓存。

  • 收到 EXEC 命令后进入事务执行,如果事务中的任意命令语法有错,其余的命令会执行失败。

  • 收到 EXEC 命令后进入事务执行,如果事务中的任意指令没有语法错误,但是事务中任意命令执行失败,其余的命令依然会执行成功。

  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段

  • 开始事务。

  • 命令入队。

  • 执行事务

2.2. redis事务中的常用命令

序号命令及描述
1DISCARD 取消事务,放弃执行事务块内的所有命令。
2EXEC 执行所有事务块内的命令。
3MULTI 标记一个事务块的开始。
4UNWATCH 取消 WATCH 命令对所有 key 的监视。
5[WATCH key key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

2.3. redis事务的操作

  • Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的

  • Redis事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作

3. redis的乐观锁和悲观锁

3.1. 什么是悲观锁

悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,当其他线程想要访问数据时,都需要阻塞挂起。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁、表锁,读锁,写锁等,都是在操作之前先上锁。

select * from user where id = 1 for update;

在Java中,synchronized的思想也是悲观锁。

3.2. 什么是乐观锁

mysql 乐观锁 列version版本号机制(1,2,3,4,5)

乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。

  • 乐观锁策略:提交版本作为条件必须大于等于记录当前版本才能执行更新

  • 一般会使用版本号机制或CAS操作实现

3.3. redis中乐观锁 watch监控

  • 先监控一个key,再开启一个事务,在当前事务中对key进行操作

  • 再启动一个redis客户端 来修改这个key

  • 再提交之前的事务

3.4. redis中的悲观锁

  • 使用Redis实现悲观锁命令SETNX命令

  • 当且仅当 key 不存在,缓存数据,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0

使用场景:

在Java中实现分布式锁通常是为了解决多个进程或多个服务器实例之间共享资源访问的同步问题。由于分布式系统中的锁需要跨多个节点工作,因此不能简单地使用Java中的synchronized关键字或ReentrantLock类,这些只能在单个JVM内部工作。

4. redis发布订阅的功能

4.1. 什么是发布订阅

  • 进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)(消费者)接收消息。

  • Redis 发送者、客户端(消费方)可以订阅任意数量的频道

  • 下图展示了频道 channel1(通道) , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

  • 当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

4.2. redis的发布订阅的应用

  • 发送邮件、短信

  • 聊天室功能

  • 公告牌显示功能

  • 服务之间利用消息解耦

4.3. redis发布订阅的相关命令

序号命令及描述
1[PSUBSCRIBE pattern pattern ...] 订阅一个或多个符合给定模式的频道。发送者使用
2PUBSUB subcommand [argument [argument ...]] 查看订阅与发布系统状态。
3PUBLISH channel message 将信息发送到指定的频道。发送者使用
4PUNSUBSCRIBE [pattern [pattern ...]] 退订所有给定模式的频道,发送者使用
5[SUBSCRIBE channel channel ...] 订阅给定的一个或多个频道的信息。消费者使用
6UNSUBSCRIBE [channel [channel ...]] 指退订给定的频道。消费者使用

消费者订阅监听对应的频道

生产者向对应的频道发送消息(将消息和频道进行绑定)

5. redis数据删除和淘汰策略

5.1. 过期数据

redis中的数据特征

Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态

TTL返回的值有三种情况:正数,-1,-2

  • 正数:代表该数据在内存中还能存活的时间,过期时间

  • -1:永久有效的数据

  • -2 :已经过期的数据 或 被删除的数据 或 未定义的数据

删除策略就是针对已过期数据的处理策略,已过期的数据是真的就立即删除了吗?其实也不是,我们会有多种删除策略,是分情况的,在不同的场景下使用不同的删除方式会有不同效果,这也正是我们要将的数据的删除策略的问题

5.2. 数据过期删除策略

删除策略指的是数据删除的时机(什么时候删除数据)

在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或 内存泄露

针对过期数据要进行删除的时候都有哪些删除策略呢?

  • 1.定时删除(默认)

    • 创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作

  • 2.惰性删除

    • 数据到达过期时间,不做处理。等下次访问该数据时,我们需要判断

  • 3.定期删除

    • Redis启动服务器初始化时,读取配置hz的值,默认为10

    • 每秒钟执行hz次activeExpireCycle(),对每个Redis库逐一进行检测,每次执行耗时:250ms/10 100ms/16

    • 对某个Redis库检测时,随机挑选w个key检测

      如果key超时,删除key    
      ​
      如果一轮中删除的key的数量>检测key总数的25%,循环该过程
      如果一轮中删除的key的数量≤检测key总数的25%,检查下一个Redis库,0-15循环
      ​
      w取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值

5.3. 数据淘汰策略

什么叫数据淘汰策略?什么样的应用场景需要用到数据淘汰策略?

当新数据进入redis时,如果内存不足怎么办?在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为数据淘汰策略。

LRU关键是看最后一次被使用到发生替换的时间长短,时间越长,就会被淘汰;而LFU关键是看一定时间段内被使用的频率(次数),使用频率越低,就会被淘汰

第一类:检测易失数据

volatile-lru:挑选最近最少使用的数据淘汰(最后一次使用时间)
volatile-lfu:挑选最近使用次数最少的数据淘汰(最近一段时间的使用次数)
volatile-ttl:挑选将要过期的数据淘汰
volatile-random:任意选择数据淘汰

第二类:检测全库数据

allkeys-lru:挑选最近最少使用的数据淘汰(最后一次使用时间)
allkes-lfu::挑选最近使用次数最少的数据淘汰(最近一段时间的使用次数)
allkeys-random:任意选择数据淘汰,相当于随机

第三类:放弃数据驱逐

no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发OOM(Out Of Memory)

5.4. 数据淘汰策略设置

redis.conf文件中配置

maxmemory-policy noeviction

重点

1、redis持久化机制(重要)

2、redis的数据删除策略(重要)

3、redis的过期策略(重要)

4、redis事务相关命令和事务特点

5、redis的乐观锁和悲观锁

6、redis的发布订阅机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84349.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84349.shtml
英文地址,请注明出处:http://en.pswp.cn/web/84349.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gartner发布网络安全组织设计指南:设计网络安全组织的五项原则和六种主要安全组织类型

安全和风险管理领导者经常寻求一种通用的模型来组织其职能,这可能导致效率低下和需求得不到满足。然而,目前并没有一个标准的组织模型。这项研究可以帮助他们根据企业实际情况,设计出最合适的网络安全组织。 主要发现 许多安全和风险管理 (SR…

简述redis的单线程模式

在redis版本6之前,网络IO和键值对读写都是由一个线程来完成的。而redis的其他功能,比如持久化、异步删除、集群数据同步等,是由其他线程完成的。 为什么采用单线程 多线程有助于提升吞吐率(系统同时处理的请求数)&am…

WebSocket深度指南:从零基础到生产级应用

📚目录 1. WebSocket基础概念深度解析 2. WebSocket协议技术详解 3. WebSocket生命周期与状态管理 4. Spring Boot WebSocket完整实现 5. 完整聊天室项目实战 6. 高级功能与扩展应用 1. WebSocket基础概念深度解析 1.1 什么是WebSocket?深度理解 WebSocket是HTML5开…

复现 apache HTTPD 换行解析漏洞(CVE-2017-15715)

一、漏洞环境 docker环境 http://192.168.99.124:8082二、漏洞原理 Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致…

创始人 IP 起盘方法论:从 0 到 1 的系统化破局路径

在流量逻辑不断更新的当下,创始人 IP 如何构建可持续的商业闭环?结合行业头部案例的实战经验,可梳理出一套兼顾落地性与前瞻性的起盘策略,帮助 IP 在波动的市场中建立稳定的变现能力。 一、定位:在动态中验证方向 某…

数据结构 6(算法)

一、算法 1、概念 问题的求解方法 2、算法的特性和设计要求 算法的特性: 确定性 有穷性 输入输出 可行性 设计要求: 正确性 高效性 低存储 健壮性 可读性 3、时间复杂度O(n) 用于评估程序执行…

Android 开发问题:android.content.res.Resources$NotFoundException: Resource ID

android.content.res.Resources$NotFoundException: Resource ID #0xff412804问题原因 该异常表示 Android 系统尝试通过资源 ID 查找资源,例如,颜色、图片等,但未查找到对应资源 其中,0xff412804 是一个硬编码的整型颜色值&…

03.自动特征提取(深度学习)核心逻辑:通过多层非线性变换,让模型自动学习从原始数据到高层特征的映射。为什么多层非线性变换可以达到这样的效果?

在深度学习中,多层非线性变换能够实现自动特征提取的核心原因在于其对数据表征的分层学习能力和非线性映射的表达优势。以下从理论基础、数学机制、实际效果三个层面展开解析: 一、非线性变换的本质:突破线性模型的表达局限 线性模型的局限性 线性变换(如矩阵乘法)只能学…

42-Oracle 23 ai 安全新特性(Audit统一审计)

小伙伴们业务和安全运维中需要数据库审计都是由哪些模块来实现的,专门的第三方产品吗?在医疗领域防统方等业务场景和数据库的审计集合很是紧密。 在Oracle逐个版本的演进中,Oracle 23ai 的审计特性在安全领域的重大革新,延续传统…

Python 爬虫入门 Day 4 - 模拟登录爬虫与 Session 维持

Python 第二阶段 - 爬虫入门 🎯 今日目标 学习什么是 Cookie / Session,为什么要维持登录状态掌握 requests.Session 用法模拟登录一个带登录表单的网站获取登录后的页面内容 📘 学习内容详解 🔐 什么是 Session? …

新零售系统商城开发全解析

一、新零售系统商城概述​ (一)新零售的概念​ 新零售依托互联网与物联网技术,以数据驱动为核心,打破线上线下的界限,构建起一体化的全新零售模式。它不再局限于传统的销售渠道,而是通过整合线上电商平台、线下实体店铺以及现代物流配送等多方面资源,实现商品、服务、…

c++基础入门——c++初识

我看的是B站黑马程序员的课《C教程》。准备用这个专栏记录一下学习笔记。 这套c课程的课程安排如下: 阶段内容目标案例第一阶段C基础语法入门对c有初步了解,能够有基础编程能力通讯录管理系统第二阶段c核心编程介绍c面向对象编程,为大型项目…

【css】设置了margin-top为负数,div被img覆盖的解决方法

文章目录 场景默认情况下&#xff0c;层叠顺序是如何工作的&#xff1f;为什么 img 会覆盖 div&#xff1f;解决方法 场景 <img src"image.jpg"> <div>Content</div>有代码如上&#xff0c;img src是一个https网络图片链接。 若div的margin-top为…

4 Studying《ARM System Developer’s Guide》1-7

目录 Preface Chapter1 ARM Embedded Systems 1.1 The RISC design philosophy 1.2 The ARM Design Philosophy 1.3 Embedded System Hardware 1.4 Embedded System Software 1.5 Summary Chapter2 ARM Processor Fundamentals 2.1 Registers 2.2 Current Program St…

Vue3 + Axios + Ant Design Vue 请求封装详解教程(含 Token 鉴权、加密、下载)

Vue3 Axios Ant Design Vue 请求封装详解教程&#xff08;含 Token 鉴权、加密、下载&#xff09; 一、完整源码&#xff08;请先阅读&#xff09; import { message, Modal } from ant-design-vue; import axios from axios; import { localRead } from //utils/local-util…

SQL注入安全研究

​据OWASP 2023报告显示&#xff0c;SQL注入连续15年位居Web安全威胁榜首&#xff0c;在应用漏洞中占比34.1%​​ ​NIST统计显示&#xff1a;2022-2023年高危SQL注入漏洞同比增长27%&#xff0c;企业平均修复成本达$320,000​ 一、漏洞本质与技术原理解析 1. SQL注入核心机理…

Ubuntu最新版本(Ubuntu22.04LTS)安装nfs服务器

NFS&#xff08;Network File System&#xff09;是一种允许不同计算机之间共享文件的网络文件系统。 在Ubuntu 22.04 LTS中&#xff0c;您可以使用以下步骤安装并配置NFS服务器。 一、安装NFS服务器 在Ubuntu 22.04 LTS中&#xff0c;您可以使用以下命令安装NFS服务器&…

学习笔记丨数字信号处理(DSP)的应用——图像处理篇

&#x1f4cc; DSP在图像处理中的应用&#xff1a;核心技术解析 数字信号处理&#xff08;DSP&#xff09;是图像处理的核心技术之一&#xff0c;广泛应用于增强、压缩、分析和识别等领域。以下是DSP在图像处理中的关键应用及技术细节&#xff1a; 目录 &#x1f50d; 图像增…

Kafka Broker处理消费者请求源码深度解析:从请求接收到数据返回

在Kafka生态体系中&#xff0c;消费者从Broker拉取消息是实现数据消费的关键环节。Broker如何高效处理消费者请求&#xff0c;精准定位并返回对应分区数据&#xff0c;直接决定了整个消息系统的性能与稳定性。接下来&#xff0c;我们将聚焦Kafka Broker端&#xff0c;深入剖析其…

Objective-C与Swift混合编程

Objective-C与Swift混合编程的基本概念 Objective-C与Swift混合编程是指在同一项目中同时使用两种语言进行开发。这种混合编程方式在迁移旧项目或利用Swift新特性时非常有用。两种语言可以相互调用&#xff0c;但需要遵循特定的规则和桥接机制。 设置混合编程环境 在Xcode项…