理解Redis的内存回收机制和过期淘汰策略

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群

Hello,大家好。我是公众号 “八点半技术站” 的创作者 - Bruce.D。

今天是周二(2020-06-17),分享一句谚语 “读书有三到,心到口到眼到分享给大家的是 「缓存服务 模块」- 理解Redis的内存回收机制和过期淘汰策略。

欢迎热爱 IT编程的各位精英,欢迎进入wechat技术群(底部有二维码)一起交流成长。

花几分钟时间去浏览 redis 技术干货,或许对你有用!!!

底部有本篇文章的思维导图 ,供大家收藏使用~~~

image.gif编辑

01

今天写这篇文章的灵感,来自之前一位好友投稿的面试题:redis 的过期策略有哪些?内存淘汰机制有哪些?我将工作中遇到的问题分析,整理成一篇文章提供大家学习,希望对大家有所帮助。

我们从一次广告数据问题说起:一个依赖定时器任务的生成接口数据,有时候会有,有时候没有。

然后我们分析应该是redis过期删除策略导致。

排查过程中,因为手动执行定时器,set数据没有报错,但是set后不生效。这就狠尴尬。

发现,set 没有报错,但是 set 完毕在查的情况下,发现没有数据。开始怀疑 redis 的过期策略(准确来说应该是 redis 的内存回收机制中的数据淘汰策略触发内存上限淘汰数据),导致新加入的的redis的数据都被丢弃了。

最终发现故障是因为配置问题,导致数据错误。(有时候也会因为内存满)

在这里我主要希望大家明白,我们遇到类似问题,如何有效证明正确性,以及什么情况下怀疑内存回收才是合理,所以内存回收机制的一系列问题,你也要知道了解。

02

Q:为什么需要内存回收?

A:第一种:在redis 中,set 指令可以指定 key 的过期时间,当过期时间达到以后,key 就会失效。

第二种:redis 是基于内存操作的,所有的数据都是保存在内存中,一台机器的内存是很宝贵的。

分析:根据以上这俩种,为了保证 redis 提供有效可靠的服务,redis 需要一种机制清理不常用的、无效的、多余的数据,失效后的数据需要及时清理,这就需要内存回收。

03

redis 的内存回收主要分为:过期删除策略 与 内存淘汰策略 俩部分。

过期删除策略:删除到达过期时间的 key 。(过期删除策略原理 - 结合文章,百度自行搜索)

第一种:定时删除

对于每一个设置了过期时间的 key 都会创建一个定时器,一旦达到过期时间都会删除。这种方式立即清除过期数据,对内存比较好,

但是有缺点是:占用了大量 CPU 的资源去处理过期数据,会影响 redis 的吞吐量 和 响应时间。

第二种:惰性删除

当访问一个 key 的时候,才会判断该 key 是否过期,如果过期就删除。该方式能最大限度节省 CPU 的资源。

但是对内存不太好,有一种比较极端的情况:出现大量的过期 key 没有被再次访问,因为不会被清除,导致占用了大量的内存。

第三种:定期删除

每隔一段时间,扫描redis 中过期key 的字典,并清除部分过期的key。这种方式是前俩种一种折中方法。

不同的情况下,调整定时扫描时间间隔,让CPU 与 内存达到最优。

内存淘汰策略:redis 内存淘汰策略是指达到maxmemory极限时,使用某种算法来决定来清理哪些数据,以保证新数据存入。(原理同上)

redis的内存淘汰机制分为:

(1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。

(2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。

(3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key。

(4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key。

(5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。

(6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。

04

总结:看完这些,我们得知道一点,如何证明故障不是由于内存回收机制引起的?

根据上述分析,set 没有报错,但是不生效,那么就2种情况:

(1)设置过期时间过短

(2)内存超过最大限制,且设置的是noeviction或者allkeys-random。

因此,在遇到这种情况,首先看set的时候是否加了过期时间,且过期时间是否合理,如果过期时间较短,那么应该检查一下设计是否合理。

如果过期时间没问题,那就需要查看Redis的内存使用率,查看Redis的配置文件或者在Redis中使用info命令查看Redis的状态,maxmemory属性查看最大内存值。

如果是0,则没有限制,此时是通过total_system_memory限制,对比used_memory与Redis最大内存,查看内存使用率。

如果当前的内存使用率较大,那么就需要查看是否有配置最大内存,如果有且内存超了,那么就可以初步判定是内存回收机制导致key设置不成功,还需要查看内存淘汰算法是否noeviction或者allkeys-random.

如果是,则可以确认是redis的内存回收机制导致。

如果内存没有超,或者内存淘汰算法不是上面的两者,则还需要看看key是否已经过期,通过ttl查看key的存活时间。

如果运行了程序,set没有报错,则ttl应该马上更新,否则说明set失败,如果set失败了那么就应该查看操作的程序代码是否正确了。

全文思维导图:

image.gif编辑

恭喜你,又读完了一篇文章。

在这里,希望你看完的 每篇文章 都能对自己有所提升(哪怕是帮助你再次巩固记忆)。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
28天前
|
存储 监控 算法
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,着重介绍垃圾回收(Garbage Collection, GC)机制。通过阐述GC的工作原理、常见算法及其在Java中的应用,帮助读者提高程序的性能和稳定性。我们将从基本原理出发,逐步深入到调优实践,为开发者提供一套系统的理解和优化Java应用中内存管理的方法。
|
10天前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
40 10
|
9天前
|
存储 算法 Java
Go语言的内存管理机制
【10月更文挑战第25天】Go语言的内存管理机制
15 2
|
10天前
|
缓存 监控 NoSQL
Redis 缓存穿透及其应对策略
【10月更文挑战第23天】通过以上对 Redis 缓存穿透的详细阐述,我们对这一问题有了更深入的理解。在实际应用中,我们需要根据具体情况综合运用多种方法来解决缓存穿透问题,以保障系统的稳定运行和高效性能。同时,要不断关注技术的发展和变化,及时调整策略,以应对不断出现的新挑战。
31 4
|
30天前
|
存储 缓存 NoSQL
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
35 2
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
|
10天前
|
存储 运维 Java
💻Java零基础:深入了解Java内存机制
【10月更文挑战第18天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
21 1
|
21天前
|
存储 缓存 NoSQL
Redis Quicklist 竟让内存占用狂降50%?
【10月更文挑战第11天】
38 2
|
30天前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
35 2
|
30天前
|
缓存 分布式计算 NoSQL
大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念
大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念
60 2
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
330 0