【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

相关文章

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

docker如何删除悬空镜像

《docker如何删除悬空镜像》文章介绍了如何使用Docker命令删除悬空镜像,以提高服务器空间利用率,通过使用dockerimage命令结合filter和awk工具,可以过滤出没有Tag的镜像,并将... 目录docChina编程ker删除悬空镜像前言悬空镜像docker官方提供的方式自定义方式总结docker

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

SpringBoot中的404错误:原因、影响及解决策略

《SpringBoot中的404错误:原因、影响及解决策略》本文详细介绍了SpringBoot中404错误的出现原因、影响以及处理策略,404错误常见于URL路径错误、控制器配置问题、静态资源配置错误... 目录Spring Boot中的404错误:原因、影响及处理策略404错误的出现原因1. URL路径错

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查