Redis篇:持久化、淘汰策略,缓存失效策略
关注公众号,一起交流,微信搜一搜: 潜行前行
redis 持久化
redis 的数据是保存再系统内存里面的。持久化就是把内存的数据转移到磁盘中,redis 的持久化策略有两种:RDB、AOF
RDB
- RDB 是以快照的形式把内存里的数据生成一个 RDB 格式备份文件,定时保存。保存的是数据的压缩过数据结构
- 有两个命令 SAVE、BGSAVE 可以生成 RDB 文件,SAVE 会阻塞主服务进程,直到 RDB 文件创建完毕。BGSAVE 则是派生一个子进程去执行 RDB 的生成
- RDB 会在 redis 启动时被加载,没有特殊加载命令
RDB 的原理总结
- 当 redis 需要做持久化时,redis 会 fork一个子进程,子进程将数据写到磁盘上一个临时 RDB 文件中。当子进程完成写临时文件后,将原来的 RDB 文件替换掉,这样的好处是可以copy-on-write
RDB 优缺点
- 适合冷备份。对于灾难恢复而言,RDB 是非常不错的选择。RDB 是经过压缩的数据,体积小
- 恢复更快。相比于 AOF 机制,RDB 的恢复速度更更快,更适合恢复数据,特别是在数据集非常大的情况
- 系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。所以,RDB 实际场景下,需要和 AOF 一起使用
- 由于 RDB 是通过 fork 子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器卡顿
AOF
- AOF 的实现可以分为三个步骤:命令追加(append)、文件写入、文件同步(sync)
- redis 执行一个写命令时,会以协议格式将命令追加到 aof_buf 的缓冲区末尾
- 在 redis 的事件循环执行周期,处理文件事件时,则会考虑是否将 aof_buf 缓冲区的数据写入到 AOF 文件。这其中有三种策略:1-always aof_buf 数据全部同步到 AOF 文件、2-everysec 每秒同步一次、3-no 不同步
- 默认是 everysec 策略
- 如果 AOF 日志过大,redis 会启用 rewrite 机制。在 rewrite log 时,会对其中的指令进行压缩,创建出一份需要恢复数据的最小日志出来。可使用 BGREWRITEAOF 命令 fork 子进程单独处理,不会影响 redis 主进程
- AOF 的同步频率比 RDB 的同步频率高,如果同时开启 AOF 和 RDB,redis 优先选择 AOF 同步文件
AOF 优缺点
- AOF 实时同步比 RDB 快 。该机制对日志文件的写入操作采用的是 append 模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容
- 如果本次操作只是写入了一半数据就出现了系统崩溃问题也不用担心,在 redis 下一次启动之前,可以通过 redis-check-aof 工具来解决数据一致性的问题
- 对于相同数量的数据集而言,AOF 文件通常要大于 RDB 文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快
redis 内存淘汰策略
- no-eviction
- redis 不再继续提供写请求 (DEL 请求可以,读请求也可以)。这可以保证不会丢失数据,但是会让线上的业务不能持续进行,这是默认的淘汰策略
- volatile-lru
- 尝试淘汰设置了过期时间的 key,最近最少使用的 key 优先被淘汰。没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失(使用最多)
- volatile-ttl
- 跟上面一样,只是优先淘汰剩余过期时间 ttl 的最小的 key,ttl 越小越先被淘汰
- volatile-lfu
- 从所有配置了过期时间的 key 中淘汰使用频率最少的键
- volatile-random
- 从设置了过期时间的 key 中淘汰数据
- allkeys-lru
- 区别于 volatile-lru,这个策略要淘汰的 key 对象是全体的 key 集合,而不只是过期的 key 集合
- allkeys-random
- 从所有键中随机淘汰 key
- allkeys-lfu
- 从所有键中淘汰使用频率最少的键
redis 过期键删除策略
- 定时删除
- 在设置键的过期时间的同时,创建一个定时器,让定时器在讲的过期时间来临时,执行对键的删除操作
- 定时删除会占用CPU时间,响应服务器的响应时间和吞吐量
- 惰性删除
- 任由键过期先不删除,但是每次从键空间中获取键时都检查取得的键是否过期,如果过期则删除键
- 惰性删除浪费太多内存,有内存泄漏的危险
- 定期删除
- 每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于删除多少过期键,则根据多少个过期键和算法决定
- 定期删除是前两种策略的整合和折中。因为是批量操作,并限定了执行时长和频率,可以有效减少删除操作对CPU的响应,也避免了内存长久不删除的导致的浪费
redis 的过期键删除策略
- redis 实际使用了惰性删除和定期删除两种策略,合理地在CPU时间和避免浪费空间之中保持平衡
- 惰性删除的 set 等命令执行
- 惰性删除的 get 等命令执行
欢迎指正文中错误
参考文章
- redis 设计与实现
- Redis的47连环炮,试试你能看住几个
Redis篇:持久化、淘汰策略,缓存失效策略的更多相关文章
- Redis双写一致性与缓存更新策略
一.双写一致性 双写一致性,也就是说 Redis 和 mysql 数据同步 双写一致性数据同步的方案有: 1.先更新数据库,再更新缓存 这个方案一般不用: 因为当有两个请求AB先后更新数据库后,A应该 ...
- 缓存失效策略(FIFO,LRU,LFU)
当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据.常用的淘汰算法有下面几种: 1. FIFO:First In First Out,先进先出.判断被存储的时 ...
- Azure技术系列之Redis篇---第一章数据缓存
嘈杂和忙碌的生活占据占据了生活的每一天,好久没有静下心来对自己喜欢的技术进行归纳总结了.痛定思痛,今天开始开荒,把之前研究的技术进行归纳总结,先从Azure的Redis的开发技术开始. Azure 的 ...
- 深入剖析 redis AOF 持久化策略
本篇主要讲的是 AOF 持久化,了解 AOF 的数据组织方式和运作机制.redis 主要在 aof.c 中实现 AOF 的操作. 数据结构 rio redis AOF 持久化同样借助了 struct ...
- 深入剖析 redis RDB 持久化策略
简介 redis 持久化 RDB.AOF redis 提供两种持久化方式:RDB 和 AOF.redis 允许两者结合,也允许两者同时关闭. RDB 可以定时备份内存中的数据集.服务器启动的时候,可以 ...
- redis六种内存淘汰策略学习
当客户端会发起需要更多内存的申请,Redis检查内存使用情况,如果实际使用内存已经超出maxmemory,Redis就会根据用户配置的淘汰策略选出无用的key; 当前Redis3.0版本支持的淘汰策略 ...
- Redis的内存淘汰策略(八)
一:Redis的AOF是什么? 以日志的形式来记录每个写操作(读操作不记录),将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构 ...
- Redis的内存淘汰策略
Redis占用内存大小 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小. 1.通过配置文件配置 ...
- Redis 内存满了怎么办? Redis的内存淘汰策略
https://juejin.im/post/5d674ac2e51d4557ca7fdd70 Redis占用内存大小 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限, ...
随机推荐
- [hdu7082]Pty loves lcm
先将问题差分,即仅考虑上限$R$(和$L-1$) 注意到$f(x,y)$增长是较快的,对其分类讨论: 1.若$y\ge x+2$,此时满足$f(x,y)\le 10^{18}$的$(x,y)$只有约$ ...
- 深度学习,机器学习神器,白嫖免费GPU
深度学习,机器学习神器,白嫖免费GPU! 最近在学习计算机视觉,自己的小本本没有那么高的算力,层级尝试过Google的Colab,以及移动云的GPU算力,都不算理想.如果数据集比较小,可以试试Cola ...
- 【JavaSE】Java基础·疑难点汇集
Java基础·疑难点 2019-08-03 19:51:39 by冲冲 1. 部分Java关键字 instanceof:用来测试一个对象是否是指定类型的实例. native:用来声明一个方法是由与 ...
- Web Api 宿主的搭建
首先我们要清楚一个概念,宿主.宿主是什么意思?先从了解一下Hosting开始吧! 有关Hosting的基础知识 Hosting是一个非常重要,但又很难翻译成中文的概念.翻译成:寄宿,大概能勉强地传达它 ...
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
- NFLSOJ #10317. -「2020联考北附2」三千世界(找等价表达+树形 dp)
题面传送门 出题人可能原本感觉没啥难度的 T2 竟然变成了防 AK 题,奇迹奇迹( 首先带着这个 \(\max\) 肯定不太好处理,考虑找出 \(f(S)\) 的等价表达.我们考虑以 \(1\) 为根 ...
- Codeforces 1500E - Subset Trick(线段树)
Codeforces 题目传送门 & 洛谷题目传送门 一道线段树的套路题(似乎 ycx 会做这道题?orzorz!!11) 首先考虑什么样的 \(x\) 是"不合适"的,我 ...
- Spark3学习【基于Java】3. Spark-Sql常用API
学习一门开源技术一般有两种入门方法,一种是去看官网文档,比如Getting Started - Spark 3.2.0 Documentation (apache.org),另一种是去看官网的例子,也 ...
- linux 软链接与查看历史指令
ln 说明 软连接也叫符号链接,类似于windows里的快捷方式,主要存放了路径. 基本语法 ln -s[原文件或目录][软连接名] 删除软链接 [root@hadoop102 ~]# rm -rf ...
- 学习java 7.28
学习内容: Applet Applet一般称为小应用程序,Java Applet就是用Java语言编写的这样的一些小应用程序,它们可以通过嵌入到Web页面或者其他特定的容器中来运行,也可以通过Java ...