【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

相关文章

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Redis指南及6.2.x版本安装过程

《Redis指南及6.2.x版本安装过程》Redis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSIC语言编写、支持网络、... 目录概述Redis特点Redis应用场景缓存缓存分布式会话分布式锁社交网络最新列表Redis各版本介绍旧