继续学习redis05-08,大家一起加油哇!!

Redis

5.缓存-持久化

  • redis作为缓存,数据的持久化是怎么做的?

1.RDB

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据

以下这两种命令,都是人工主动备份:

[root@localhost ~]# redis-cli
127.0.0.1:6379>save #由Redis主进程来执行RDB,会阻塞所有命令
ok
127.0.0.1:6379> bgsave  #开启子进程执行RDB,避免主进程受到影响
Background saving started

(无需人工,使用子进程)redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

#900秒内,如果至少有1个key被修改,则执行bgsave
save 900 1
save 300 10
save 60 10000
  • RDB的执行原理?

bgsave开始时会fork(克隆)主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。

fork采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

页表:记录虚拟地址与物理地址的映射关系 alt

写操作很多 → 会不会拷贝很多次?

不会拷贝很多“份数据”,只会拷贝很多“被写到的页”。

这是一种 “按需、增量、页级别”复制机制

RDB 拷贝 = 不是 Key 级 = 不是对象级 = 是【内存页级(4KB)】

理论最坏情况: RDB期间几乎所有内存页都被写过→ 内存占用 ≈ 原数据 × 2 因此官方文档强调:Redis 需要预留足够的内存来支持 fork + COW

2.AOF

AOF全称为Append Only File(追加文件)。redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件。

[root@localhost redis-6.2.4]# redis-cli
127.0.0.1:6379> set num 123
OK

alt

AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:

#是否开启AOF功能,默认是no
appendonly yes
#AOF文件的名称
appendfilename "appendonly.aof"

AOF的命令记录的频率也可以通过redis.conf文件来配:(一般使用everysec)

设置刷盘策略:

#表示每执行一次写命令,立即记录到AOF文件
appendfsync always
#写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
#写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
配置项 刷盘时机 优点 缺点
always 同步刷盘 可靠性高,几乎不丢数据 性能影响大
everysec 每秒刷盘 性能适中 最多丢失1秒数据
no 操作系统控制 性能最好 可靠性差,可能丢失大量数据

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

alt

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:

# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb

RDB与AOF对比

RDB与AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。

RDB AOF
持久化方式 定时对整个内存做快照 记录每一次执行的命令
数据完整性 不完整,两次备份之间会丢失(假如redis宕机) 相对完整,取决于刷盘策略
文件大小 会有压缩,文件体积小 记录命令,文件体积很大
宕机恢复速度 很快
数据恢复优先级 低,因为数据完整性不如AOF 高,因为数据完整性更高
系统资源占用 高,大量CPU和内存消耗 低,主要是磁盘IO资源 但AOF重写时会占用大量CPU和内存资源
使用场景 可以容忍数分钟的数据丢失,追求更快的启动速度 对数据安全性要求较高常见

✅ 面试 / 汇报首选版本

RDB 是对内存中数据状态的快照持久化, AOF 是对 Redis 写命令的日志持久化。

✅ 更对称、也更好记的版本

RDB 持久化的是“结果”, AOF 持久化的是“过程”。

  • 如果考官追问一句“那为什么不能说 AOF 是操作?”

因为 AOF 只记录会修改数据的写命令,而不会记录读命令或内部操作,所以严格来说它是写命令日志,而不是所有操作。

6.缓存-数据过期策略

  • 假如redis的key过期之后,会立即删除吗?

Redis对数据设置数据的有效时间,数据过期以后,就需要将数据从内存中删除掉。可以按照不同的规则进行删除,这种删除规则就被称之为数据的删除策略(数据过期策略)

例如:set name heima 10 10秒过后删除

1.惰性删除

惰性删除:设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。

例子:

set name zhangsan 10
get name // 发现name过期了,直接删除key
  • 优点:对CPU友好,只会在使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查
  • 缺点:对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放

2.定期删除

定期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key)。

定期清理有两种模式:

● SLOW模式是定时任务,执行频率默认为10hz(每秒执行10次(执行周期是100ms)),每次不超过25ms(不能影响主进程),以通过修改配置文件redis.conf的hz选项来调整这个次数

●FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms

优点:可以通过限制删除操作执行的时长和频率来减少删除操作对CPU的影响。另外定期删除,也能有效释放过期键占用的内存。

缺点:难以确定删除操作执行的时长和频率。

!!redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用

总结:

Redis的数据过期策略

  • 惰性删除:访问key的时候判断是否过期,如果过期,则删除

  • 定期删除:定期检查一定量的key是否过期(SLOW模式+FAST模式)

Redis的过期删除策略:惰性删除+定期删除两种策略进行配合使用

7.缓存-数据淘汰策略

  • 假如缓存过多,内存是有限的,内存被占满了怎么办?

数据的淘汰策略:当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。

redis支持8中不同策略来选择要删除的key:

  • noeviction:不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略
#
#The default is:
#
# maxmemory-policy noeviction
  • volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰。

  • allkeys-random:对全体key,随机进行淘汰。

  • volatile-random:对设置了TTL的key,随机进行淘汰。

  • allkeys-Iru: 对全体key,基于LRU算法进行淘汰。

  • volatile-Iru:对设置了TTL的key,基于LRU算法进行淘汰。

  • allkeys-Ifu:对全体key,基于LFU算法进行淘汰。

  • volatile-lfu:对设置了TTL的key,基于LFU算法进行淘汰。

    • LRU(Least Recently Used)最近最少使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

      例:key1是在3s之前访问的,key2是在9s之前访问的,删除的就是key2

    • LFU(Least Frequently Used)最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。

      例:key1最近5s访问了4次,key2最近5s访问了9次,删除的就是key1

数据淘汰策略-使用建议

  1. 优先使用allkeys-Iru策略。充分利用LRU算法的优势,把最近最常访问的数据留在缓存中。如果业务有明显的冷热数据区分,建议使用。

  2. 如果业务中数据访问频率差别不大,没有明显冷热数据区分,建议使用allkeys-random,随机选择淘汰。

  3. 如果业务中有置顶的需求,可以使用volatile-lru策略,同时置顶数据不设置过期时间,这些数据就一直不被删除会淘汰其他设置过期时间的数据。

  4. 如果业务中有短时高频访问的数据,可以使用allkeys-Ifu或 volatile-Ifu策略。

关于数据淘汰策略其他的面试问题

  1. 数据库有1000万数据,Redis只能缓存20w数据,如何保证Redis中的数据都是热点数据?

    使用allkeys-lru(挑选最近最少使用的数据淘汰)淘汰策略,留下来的都是经常访问的热点数据

    注:一开始想的是lfu,觉得访问频率越高才对,

    在该场景下优先选择 LRU 而不是 LFU,不是因为 LFU 不好,而是 LRU 更符合 Redis 热点数据的“时效性”特征,实现成本更低,稳定性更好

    1️⃣ LRU 解决的问题是:最近是否还在被用

    • 判断标准:最近一次访问时间

    • 更敏感于 访问趋势变化

    • 适合:

      • 热点快速变化
      • 突发流量
      • 业务波动明显

    👉 更贴近“实时热点”

    2️⃣ LFU 解决的问题是:历史上用得多不多

    • 判断标准:累计访问频次

    • 强调长期统计

    • 适合:

      • 热点长期稳定
      • 流量分布相对平缓

    👉 更贴近“长期热门”

    缓存容量远小于数据总量、且热点变化频繁的场景下,使用 allkeys-lru 更有利于快速淘汰不再被访问的数据,保证缓存中的数据贴近当前热点。 相比之下,LFU 更关注历史访问频次,容易保留已经失去时效性的旧热点,因此不作为首选。

  2. Redis的内存用完了会发生什么?

主要看数据淘汰策略是什么?如果是默认的配置(noeviction),会直接报错

总结:

1.Redis提供了8种不同的数据淘汰策略,默认是noeviction不删除任何数据,内存不足直接报错

2.LRU:最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

3.LFU:最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高

平时开发过程中用的比较多的就是allkeys-Iru(结合自己的业务场景)

#数据人的面试交流地##找工作的破防时刻##牛客解忧铺##我的求职进度条#
全部评论

相关推荐

目前欧美程序员利用ai工具成功成为超级个体的案例越来越多,国内美团也开始招聘全栈工程师,说明当前ai编译器对程序员的提效是非常明显的,基于这个事实,我认为后面独立开发者或者小巨人企业会非常多。市场痛点目前市场的痛点是没有一个好的平台将提出idea的人和全栈工程师高效紧密联系起来,也没有一套完整的分成体系,所以我想做一个和传统程序员外包接单平台不一样的平台,在我的平台里,需求提出方不再仅仅是消费者,而是类似于产品经理的角色,与程序员共同合作形成一个微型创业组织,开发人员提供劳动力,idea提出人提出需求、追踪进度、产品推广......双方还可以各自分成股份,为产品进行推广和提供订阅,甚至后续可以协商将股权抛售,当然平台依然可以进行传统的用户提出需求程序员接单的业务场景。这个世界不缺好的创意者,也不缺需求,但是过去一人的能量有限,缺乏资金、缺乏行动力、缺乏人脉、缺乏相关专业知识,导致很多个性化的细分垂直需求无法亲自实现,这个平台提供了各行各业人员和程序员合作的机会,真正做到“计算机为世界赋能”,举几个例子:有用户希望有一款找律师的app,性别、年龄、毕业院校、执证情况、擅长的官司类型、具体费用等等;或是35岁以上招聘软件,专门收录招聘中高龄员工的企业,也包括行业类别、薪资区间、高精尖企业或低端劳动力市场企业等等;或是专门为钓鱼佬群体提供的app,包括钓点地图、钓鱼天气预报、渔具市场、附近钓鱼组织;或是人生轨迹记录本,以树状的形式记录一个人一生经历的重大事件.......等等。类似的个性化需求场景会非常多,如此多的个性化垂直需求,在过去由于缺乏技术能力、资本积累、人脉关系等等难以将好的idea落实为产品。平台优势而今天每个人都有机会成为新时代的微型创业组织里的一员,下面我将介绍我的平台优势:1.AI时代超级个体赋能,普通人+AI工具+全栈工程师,三者结合,能以极低成本(时间+金钱)把idea变成真实产品,过去需要团队+百万资金的事,现在一人+合作就能搞定。2. 极低创业门槛,无需自己会代码不会编程的产品经理/行业专家也能主导产品,只需提出需求和方向,平台匹配顶级工程师,真正实现“想法即产品”。3.风险共担,收益共享的公平机制合作失败大家都没损失(只投入时间),成功了按贡献分成,比传统创业(自己拉团队、烧钱)风险低百倍。4.快速验证市场,MVP一周上线借助AI工具和全栈工程师,想法到可测试产品只需几天到几周,快速验证市场需求,避免盲目开发。5. 潜在爆款孵化器平台会聚集大量长尾需求,其中必然涌现高共性、高价值的爆款项目(类似早期的美团、抖音都源于细分需求),参与者有机会一起吃到红利。6.社区与资源网络效应加入平台不只是找合伙人,还能获得其他创业者经验、工具推荐、推广渠道,甚至后续融资机会,形成一个超级个体互助生态。7.灵活退出与股权流动项目后期支持股权协商转让或平台回购,参与者随时可以变现退出,比传统创业更灵活。8.平台保障信任机制标准合同模板、阶段里程碑、分成托管、纠纷调解,让陌生人合作也放心(这点对比爱合伙等平台是差异化优势)。9.双模式自由切换既支持传统付费外包(快速赚小钱),也支持深度股权合作(赚大钱),用户可根据项目阶段灵活选择。我的经历而目前我已经通过cursor+zeabur一人三天就上线了平台的框架,可见ai提效之迅猛。如果你是想象力丰富的创意分享者,可以在平台里发现众多志同道合的超级个体和你共同合作,也可以发现更多点子王的idea,由此受到启发,并且对于你认为有前景的项目还可以参与初期投资,以后的分红有你一份;如果你是面临35岁危机被裁员的程序员,或者在职担心自己被裁的程序员,或者苦于找不到需求借不到商单,那么在这个平台你可以利用ai工具和自己扎实的技术能力为各种有创意的想法贡献自己的技术能力,未来你或许也是某个爆款项目的初创技术专家。在过去的十年里,移动互联网发展迅猛,出现了美团、抖音、滴滴等等为人们衣食住行这种普罗大众的需求提供便利的互联网平台,而2025年,互联网从增量时代进入存量时代,在下一个十年里,我希望能在平台里提供更多个性化的需求,让计算机再一次焕发新春,让人们的生活更便携、更美好,希望大家在评论区提供建议,谢谢。平台功能不知道这个平台是否有前景?当前市场上是否已经有人做了?如果大家感兴趣,我会在后面的文章详细介绍平台里每个参与项目的用户的收益机制。
点赞 评论 收藏
分享
牛马上牛客当牛马:主管平时都会督促我让我多往大群里汇报进度,要让其它部门的领导知道项目进展,也要让最大的领导了解你的存在感和作用
mt对你说过最有启发的一...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务