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数据库,因为系统的内存大小有限, ...
随机推荐
- [hdu6326]Monster Hunter
考虑树是以1为中心的菊花图的情况,也即如何安排打怪兽的顺序 用二元组$(a,b)$来描述怪兽,则对于两个怪兽$(a_{1},b_{1})$和$(a_{2},b_{2})$,交换两者不会影响血量的变化量 ...
- [bzoj1483]梦幻布丁
对于每一个颜色用一个链表存储,并记录下:1.当前某种颜色的真实颜色:2.这种颜色的数量(用于启发式合并的判断):3.当前答案(即有几段),然后对于每一个操作简单处理一下就行了. 1 #include& ...
- gitee+typro+picgo搭建博客图床
gitee+typro+picgo搭建博客图床 前提环境 typro.picgo.nodejs 直接在官网下载即可 下载完成后,打开picgo 安装插件gitee-uploader 1.1-2即可显示 ...
- 带你了解Typescript的14个基础语法
摘要:Typescript可以说是JavaScript的超集,在JS的基础上新增了许多语法特性,使得类型不再可以随意转换,能大大减少开发阶段的错误. 本文分享自华为云社区<Typescript基 ...
- 监听浏览器tab切换
监听浏览器切屏 为了完成验证用户在切换浏览器tab时进行登录再次认证需求需要监听浏览器切换窗口 if (document.hidden !== undefined) { document.addEve ...
- PHP安装PDO_MySQL模块
下载pdo_mysql扩展 wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz 解压压缩包 tar -zxvf PDO_MYSQL-1.0.2.tgz 执 ...
- perl中tr的用法(转载)
转载:http://blog.sina.com.cn/s/blog_4a0824490101hncz.html (1)/c表示把匹配不上的字符进行替换. $temp="AAAABCDEF&q ...
- requests+bs4爬取豌豆荚排行榜及下载排行榜app
爬取排行榜应用信息 爬取豌豆荚排行榜app信息 - app_detail_url - 应用详情页url - app_image_url - 应用图片url - app_name - 应用名称 - ap ...
- Perl字符串处理函数用法集锦
Perl字符串处理函数 0.函数名 index 调用语法position=index(string,substring,position); 解说返回子串substring在字符串string中的位置 ...
- 监督学习&非监督学习
监督学习 1 - 3 - Supervised Learning 在监督学习中,数据集中的每个例子,算法将预测得到例子的""正确答案"",像房子的价格,或者溜 ...