7、Redis-事务、持久化、内存淘汰机制和过期key处理

news2024/11/24 15:37:43

目录

一、事务

二、持久化

三、内存淘汰机制

四、过期key处理


一、事务

Redis的事务本质上就是一个批量执行命令的操作。分为三个步骤:

  • 开始事务:multi
  • 命令入队:正常输入命令即可
  • 执行事务(依次执行命令):exec

执行过程中某条命令失败,事务既不会回滚,也不会停止。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name Trxcx
QUEUED // 命令入队而不是立即被执行
127.0.0.1:6379> set age 21
QUEUED
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> incr name // 错误的命令正常入队
QUEUED
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (integer) 22
4) (error) ERR value is not an integer or out of range
5) "Trxcx"
6) "22" 
// 即使中间某条命令出错,前面的命令也没有回滚,后面的命令也没有停止。
// 整个事务就是在依次执行这些命令

二、持久化

Redis会不定时地将数据持久化到硬盘中,当Redis启动时,会把硬盘中的数据加载到内存中。

Redis持久化机制共有3种:

1、RDB(Redis DataBase ):快照方式

将内存中的数据以快照的方式写入二进制文件,默认为dump.rdb【Redis安装目录下】中。触发RDB持久化的机制分为手动触发和自动触发。

  •         手动触发:

                ①使用save命令。阻塞Redis服务器直到RDB过程完成,数据较多时会长时间阻塞。

                ②使用bgsave命令。执行fork指令创建子进程实现RDB持久化。【更建议使用】

  •         自动触发:

                使用save进行配置。格式为:save m n。

                表示m秒内数据集存在n次修改则会触发bgsave。

                save 300 10:表示300秒内超过10个key被修改,则触发RDB过程进行持久化

2、AOF(Append Only File ):文件追加方式

AOF 日志是一个增量日志文件,它会记录执行的命令。因此,重启时再重新执行AOF文件中的命令,就可以达到恢复数据的目的。

Redis默认是不开启AOF的,通过修改配置文件进行配置。redis 开启AOF - 简书 (jianshu.com)

AOF共有3种配置策略,

  • appendfsync always:立即同步命令到磁盘,效率慢但保证完全持久化
  • appendfsync everysec:每秒同步一次,效率和持久化效果居中【更推荐使用】
  • appendfsync no:依赖操作系统,通常每30s同步一次

AOF Rewrite:AOF 文件记录了每个写操作的日志,以确保数据持久性。随着时间的推移,AOF 文件会不断增大。为了解决这个问题,Redis通过AOF Rewrite 操作创建一个新的 AOF 文件,其中只包含当前数据库状态的最小命令集,然后将旧的 AOF 文件替换为这个新文件。

总结:RDB持久化文件更小,启动速度更快;AOF则在持久化的效果方面更胜一筹。

3、混合持久化方式

Redis同时开启RDB和AOF,在某时刻T1进行了RDB持久化,在下一次RDB持久化(T3)之前,Redis服务器于T2时刻重启。

此时恢复数据时,T1之前的数据以 RDB 的形式写入文件的开头(全量恢复),T1到T2之间的数据则通过执行AOF文件存储的操作命令(增量恢复),以此达到速度和持久化效率的平衡。

即以 RDB 作为全量备份,AOF 作为增量备份。

4、持久化机制选择

  • 对安全性要求高:RDB+AOF
  • 可以容忍数据丢失:RDB
  • 不推荐单独AOF,可能出现bug。

关于Redis启动:

AOF和RDB同时存在时优先加载AOF;某一个存在时就加载那一个。

都不存在或加载成功时则启动成功,存在AOF或者RDB但加载失败时则启动失败。


三、内存淘汰机制

  • LRU:Least recently used。最近最少被使用到的key被淘汰。在可选的淘汰对象中,上一次使用时间距离现在最久的key被淘汰。【recently---关注时间】
  • LFU:Least Frequently Used。最不经常使用的key被淘汰。在可选的淘汰对象中,使用次数最少的key被淘汰。【Frequently ---关注使用频次】
  • TTL:设置了过期时间且快要过期的key被淘汰。
  • 随机淘汰。

四、过期key处理

  • 惰性删除:访问key时才去判断是否过期,过期则直接删除。【CPU友好,但长期不用的key会一直存在内存中,造成内存浪费】
  • 定时删除:设置定时器,到达过期时间时立即删除。【CPU不友好,需要额外维护定时器】
  • 定期删除:隔一段时间检查一次,删除过期的key。

实际使用:惰性删除+定期删除,在CPU使用和内存浪费之间取得平衡。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最近开发中遇到的一些问题

puppeteer下载失败问题 使用的淘宝镜像,但执行命令npm i puppeteer之后,报错: npm ERR! code 1 npm ERR! path E:\项目-临时\test_install_puppeteer\node_modules\puppeteer npm ERR! command failed npm ERR! command C:\WINDOWS\system3…

Android开发教程入门,那些被大厂优化的程序员们

Binder原理 1、概述 Android系统中,涉及到多进程间的通信底层都是依赖于Binder IPC机制。例如当进程A中的Activity要向进程B中的Service通信,这便需要依赖于Binder IPC。不仅于此,整个Android系统架构中,大量采用了Binder机制作…

数据库原理(关系代数)

1.集合运算符基础 要求: 具有相同的目n(即两个关系都有n 个属性)相应的属性取自同一个域t是元组变量, t R表示t是R的一个元组 1.1并 符号() R∪S { t|t R∨t S } 结果特征: 仍为n 目关…

长度为n的数组a初始值全为0,目标是把数组a变为数组b(1<=bi<=n), 可以进行任意次操作:选择长度为k的数组c,(1<=ci<=n且两两不同)

对于1<i<k, 把 a[c[i]] 改为c[i % k 1]。给定n&#xff0c;k和数组b&#xff0c;判断能否得到数组b。 题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #d…

python使用zmail实现邮件发送

一&#xff1a;zmail介绍 1、Zmail的优势 自动填充大多数导致服务端拒信的头信息&#xff08;From To LocalHost之类的)将一个字典映射为email&#xff0c;构造信件就像构造字典一样简单自动寻找邮件服务商端口号地址&#xff0c;自动选择合适的协议&#xff08;经过认证的&am…

docker 安装 portainer

小编给友友们总结了一下 Portainer 的好处以下 Portainer是Docker的图形化管理工具&#xff0c;提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作&#xff08;包括上传下载镜像&#xff0c;创建容器等操作&#xff09;、事件日志显示、容器控制台操作、Swar…

CAPL - 如何实现弹窗提示和弹窗操作

目录 函数介绍 TestWaitForTesterConfirmation Example 使用方法一 使用方法二

Hack The Box-Perfection

目录 信息收集 nmap dirsearch gobuster whatweb WEB 信息收集 ffuf 漏洞探索 漏洞发现 模板注入 反弹shell 提权 get user and flag 信息收集 ssh登录&get root and flag 信息收集 nmap 端口探测┌──(root㉿ru)-[~/kali/hackthebox] └─# nmap -p- 10…

Maven入门(作用,安装配置,Idea基础maven,Maven依赖,Maven构建项目)【详解】

目录 一. Maven的作用 1.依赖管理 2.统一项目结构 3.项目构建 二.Maven安装配置 1. Maven的仓库类型 2 加载jar的顺序 3. Maven安装配置 4.安装Maven 5.配置仓库 三.idea集成maven 1.给当前project集成maven 2.给新建project集成maven 3.创建maven项目 4.pom…

python高级之元类

python高级之元类 一、Type创建类1、传统方式创建类2、非传统方式 二、元类三、总结 一、Type创建类 class A(object):def __init__(self, name):self.name namedef __new__(cls, *args, **kwargs):data object.__new__(cls)return data根据类创建对象 objA(‘kobe’) 1、执…

前端处理接口直接返回的图片

有时候接口会直接返回图片而不是连接&#xff0c;前端需要处理后才能使用。 首先你可能需要设置responseType: blob’处理响应数据格式。 直接使用 将接口及参数动态拼接成img.src直接使用 <img src"http://test.com/api/img?size50x50" alt"">i…

Spring Webflux 详解

目录 0、组件对比 1、WebFlux 1、引入 2、Reactor Core 1、HttpHandler、HttpServer 3、DispatcherHandler 1、请求处理流程 4、注解开发 1、目标方法传参 2.返回值写法 5、文件上传 6、错误处理 7、RequestContext 8、自定义Flux配置 9、Filter WebFlux&am…

python并发编程:阻塞IO

阻塞IO&#xff08;blocking IO&#xff09; 在Linux中&#xff0c;默认情况下所有的socket都是blocking&#xff0c;一个典型的读操作流程大概是这样&#xff1a; 当用户进程调用了recvfrom这个系统调用&#xff0c;kernel就开始了IO的第一个阶段&#xff1a;准备数据。对于…

将Remix和本地文件连接

Remix连接本地文件 推荐使用网页版本的Remix&#xff0c;因为它是实时更新的&#xff0c;还可以连接MetaMask直接进行使用。 打开remix网页&#xff0c;可以通过 create a new workspace新建页面 然后找到我们要连接 的文件目录&#xff0c;在该目录中打开终端&#xff0c;如…

Pytorch学习 day05(RandomCrop、Transforms工具使用总结)

RandomCrop 将PIL或Tensor格式的输入图片&#xff0c;随机裁剪指定尺寸的部分输入尺寸可以为序列或单个整形数字代码如下&#xff1a; from PIL import Image from torchvision import transforms from torch.utils.tensorboard import SummaryWriterimg Image.open("i…

通过hyperbeam创建梁单元截面属性

1、为模型中标准的圆柱形创建梁单元和赋予属性&#xff1b; 2、为模型中不标准的对称性实体创建梁单元和赋予属性&#xff1b; 3、为模型中壳体部分创建梁单元和赋予属性&#xff1b;

C++进阶之路---继承(一)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、继承的概念及定义 1.继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0…

MybatisPlus入门详解

一、MyBatisPlus 简介 1.1 创建新模块 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency> 由于mp并未被收录到idea的系统内置配置,无法…

外包干了2年,技术退步明显

先说一下自己的情况&#xff0c;研究生&#xff0c;19年进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

Android开发中遇到最难的问题,app架构图

前言 这份Android面试真题涵盖了图片&#xff0c;网络和安全机制&#xff0c;网络&#xff0c;数据库&#xff0c;插件化、模块化、组件化、热修复、增量更新、Gradle&#xff0c;架构设计和设计模式&#xff0c;Android Framework 、Android优秀三方库源码等。适合中高级工程…