Redis 过期策略和内存淘汰策略
一、过期策略
我们在set
key
的时候,可以给它设置一个过期时间,比如expire
key
60
。指定这key60s后过期,60s后,redis是如何处理的?
- 定时删除(Active Expiration)
-
- 原理:Redis会在后台周期性地检查并删除已过期的键。
- 实现:Redis的服务器进程会定期(默认每100毫秒)运行一个过期键清理任务。这个任务会随机选择一部分数据库,检查这些数据库中的键是否已过期,如果过期则删除。
- 优点:可以及时删除过期键,释放内存。
- 缺点:如果过期键非常多,可能会导致CPU负担加重。
- 惰性删除(Lazy Expiration)
-
- 原理:当客户端尝试访问一个键时,Redis会检查该键是否已过期,如果已过期则删除该键。
- 实现:每次访问键时,Redis都会检查该键的过期时间。如果键已过期,则删除该键并返回相应的错误信息。
- 优点:不会在后台占用额外的CPU资源。
- 缺点:过期键可能在一段时间内仍然占用内存,直到被访问时才会被删除。
Redis实际上结合了定时删除和惰性删除两种策略,以达到最佳的性能和资源利用率。具体来说:
- 定时删除:定期检查并删除过期键,确保大部分过期键能够及时被清理。
- 惰性删除:在客户端访问键时,检查并删除过期键,确保不会出现访问到已过期键的情况。
二、内存淘汰策略
当Redis的内存使用达到配置的最大限制时,Redis会根据配置的内存淘汰策略来决定如何释放内存。内存淘汰策略的目的是在内存不足时,尽量保留重要的数据,避免系统崩溃。
- noeviction(默认策略)
-
- 描述:当内存使用达到上限时,新的写入操作会被拒绝,返回错误信息。
- 适用场景:适用于不允许数据丢失的场景。
- allkeys-lru
-
- 描述:当内存使用达到上限时,优先删除最近最少使用的键(Least Recently Used, LRU)。
- 适用场景:适用于缓存场景,希望保留最近经常访问的数据。
- volatile-lru
-
- 描述:当内存使用达到上限时,优先删除设置了过期时间的键中最近最少使用的键。
- 适用场景:适用于缓存场景,且希望优先保留未设置过期时间的数据。
- allkeys-lfu
-
- 描述:当内存使用达到上限时,优先删除最近最少频繁使用的键(Least Frequently Used, LFU)。
- 适用场景:适用于缓存场景,希望保留最近频繁访问的数据。
- volatile-lfu
-
- 描述:当内存使用达到上限时,优先删除设置了过期时间的键中最近最少频繁使用的键。
- 适用场景:适用于缓存场景,且希望优先保留未设置过期时间的数据。
- allkeys-random
-
- 描述:当内存使用达到上限时,随机删除键。
- 适用场景:适用于对数据一致性要求不高的场景。
- volatile-random
-
- 描述:当内存使用达到上限时,随机删除设置了过期时间的键。
- 适用场景:适用于对数据一致性要求不高的场景,且希望优先保留未设置过期时间的数据。
- volatile-ttl
-
- 描述:当内存使用达到上限时,优先删除设置了过期时间且过期时间最近的键。
- 适用场景:适用于缓存场景,希望尽快释放即将过期的数据。
这里只要记住默认的策略和最近最少使用和最少频率使用和随机删除即可,无非就是所有key和设置了过期时间的可以的区别
三、总结
- 过期策略:Redis通过定时删除和惰性删除相结合的方式来处理过期键,确保数据的时效性,同时尽量减少对性能的影响。
- 内存淘汰策略:当内存使用达到上限时,Redis会根据配置的策略来释放内存,确保系统的稳定运行。常见的策略包括LRU、LFU、随机删除等,适用于不同的应用场景。
通过合理配置这些策略,可以有效地管理和优化Redis的内存使用,确保系统的高性能和稳定性。
原文地址:https://blog.csdn.net/2302_79741013/article/details/144004221
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!