【Redis知识点总结】(三)——Redis持久化机制、内存淘汰策略、惰性删除机制

本文主要是介绍【Redis知识点总结】(三)——Redis持久化机制、内存淘汰策略、惰性删除机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Redis知识点总结(三)——Redis持久化机制、内存淘汰策略、惰性删除机制

  • Redis持久化
    • RDB
    • AOF
    • AOF与RDB的对比
    • 混合持久化
  • 内存淘汰策略
  • 惰性删除机制

Redis持久化

Redis有两种数据持久化的方式,一种是RDB、一种是AOF。

RDB

RDB是内存快照,就是给内存拍一个快照,记录内存当前的数据结构,写入到一个RDB文件中,然后重启时就可以读取这个快照文件进行内存的数据恢复。

在这里插入图片描述

Redis有两个命令可以进行RDB持久化,一个是save命令,另一个是bgsave命令。save命令是在当前线程进行RDB持久化,是阻塞当前线程的,一般不用。bgsave则会fork一个子进程进行RDB持久化,在进行持久化的时候,如果主线程发生读写操作修改内存中的数据,会使用COW(copy-on-write)技术,在内存中的数据块被修改前,把将被修改的数据块copy一份副本,让子进程读取副本进行持久化,保证子进程写到RDB文件中的快照数据的一致性。

在这里插入图片描述

AOF

AOF是Redis的另一种持久化机制。当开启AOF持久化机制时,Redis每次发生写操作时,除了写内存中的数据结构,还会把写操作的命令,写入到一个AOF文件的内存缓冲区中,然后会按照配置的频率,进行异步的AOF文件刷盘,配置的频率可以是:

  • 只写入AOF缓冲区,由操作系统控制刷盘
  • 每秒钟刷盘一次
  • 每次发生AOF写入,都刷盘一次

在这里插入图片描述

当AOF文件过大时,会触发AOF重写机制,对AOF文件进行重写,AOF文件重写可以达到文件瘦身的效果。因为AOF中有很多无效过期的命令,比如对同一个key多次修改,只需记录最后一次的修改命令即可,不需要把前面的命令都记录。

Redis的AOF文件重写机制不是读取AOF文件本身记录的内容进行重写,而是根据当前内存中的数据结构进行重写。

进行AOF重写时,主线程会通过fork函数fork出一个子进程,此时fork函数会拷贝一份主线程的内存副本给子线程。然后子线程会读取内存中的副本数据,生成新的AOF文件。在AOF重写期间,主线程会继续接受并处理客户端发来的请求,当有写请求处理时,会把写请求的命令写一份到AOF重写缓冲区。当子线程生成新的AOF文件后,会把AOF重写缓冲区中的命令往后追加到新的AOF文件中。最后子线程会用新的AOF文件覆盖老的AOF文件。

在这里插入图片描述

AOF与RDB的对比

RDB与AOF这两种持久化方式各有优缺点。

RDB模式的持久化方式,重启时数据恢复的速度较快,但是数据不安全,容易丢失数据,在两次RDB持久化期间,Redis宕机,那么在最后一次RDB持久化之后发生的数据修改就全部丢失了。

而AOF持久化方式,如果我们开启每秒钟同步AOF文件到磁盘一次,那么最多就丢失一秒钟数据。但是AOF持久化方式的数据恢复速度较慢,而且会发生频繁的IO操作,当Redis重启时,它是读取AOF文件中的命令重新执行。

在这里插入图片描述

如果我们使用Redis仅仅是用作缓存,不追求数据一致性,或者对数据一致性要求不高,可以仅开启RDB持久化,不开启AOF,或者不开启持久化。官网是不建议单独开启AOF的,原因是AOF会带来频繁的IO操作,会影响性能,而且数据恢复速度较慢。如果硬要开启AOF的话,可以使用Redis4.0版本的混合持久化机制。

混合持久化

Redis的混合持久化,就是在AOF持久化的基础上进行的修改。原来的AOF重写是读取内存数据然后写入命令到新的AOF文件,而Redis混合持久化则把AOF重写改为生成一个内存快照,也就是RDB格式的内存快照,再把该内存快照写入重新生成的AOF文件中。两次重写期间的AOF日志,将追加写入到AOF文件中的RDB快照后面。

在这里插入图片描述

在启用混合持久化时,Redis重启首先会读取AOF文件中的RDB内存快照,恢复到内存中,然后在读取后面的AOF日志,执行AOF日志记录的命令,应用到内存中。

在这里插入图片描述

这样,既可以享受到RDB的快速恢复的好处,又可以通过AOF保证数据丢失相对可控。

内存淘汰策略

Redis在内存被占满时,如果继续收到写请求,需要往内存中写入新的数据,就要进行内存淘汰的操作,把一部分数据淘汰出内存,腾出空间让新的数据写进去。

Redis有多种内存淘汰机制,包括:no-envicition、allkeys-random、volatile-random、allkeys-lru、volatile-lru、allkeys-lfu、volatile-lfu、volatile-ttl。

在这里插入图片描述

  • no-envicition:不淘汰策略,内存满了,还发生新数据的写入操作,就直接报错。
  • allkeys-random:随机的从所有的key中选取一部分进行淘汰。
  • volatile-random:在带过期时间的key中随机选取一部分进行淘汰。
  • allkeys-lru:使用LRU算法,从所有的key中选取最久未被使用过的一部分key进行淘汰。
  • volatile-lru:使用LRU算法,从带过期时间的key中选取最久未被使用过的一部分key进行淘汰。
  • allkeys-lfu:使用LFU算法,从所有的key中选取最近最少被使用的一部分key进行淘汰。
  • volatile-lfu:使用LFU算法,从带过期时间的key中选取最近最少被使用的一部分key进行淘汰。
  • volatile-ttl:从带过期时间的key中选取最快到期的一部分key进行淘汰。

惰性删除机制

Redis中过期键的删除不是立即删除,而是惰性删除。惰性删除一方面会定时的随机抽取一部分key检查是否过期,一方面是当查询某个key发现它过期时,会顺便删除,然后返回空值。

在这里插入图片描述

这篇关于【Redis知识点总结】(三)——Redis持久化机制、内存淘汰策略、惰性删除机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/791375

相关文章

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Redis MCP 安装与配置指南

《RedisMCP安装与配置指南》本文将详细介绍如何安装和配置RedisMCP,包括快速启动、源码安装、Docker安装、以及相关的配置参数和环境变量设置,感兴趣的朋友一起看看吧... 目录一、Redis MCP 简介二、安www.chinasem.cn装 Redis MCP 服务2.1 快速启动(推荐)2.

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont