redis的内存管理主要依靠两个进程:内存回收进程和AOF持久化进程。下面将重点讲解 Redis 内存回收机制,以及这个机制如何工作。
一、Redis的内存回收机制
Redis 使用了内存池(memory pool)来分配空间,并且它针对不同对象的大小,提供了不同的内存分配策略。
Redis中所有的键值都保存在内存中,如果内存占满,Redis服务器就会stop working, 同时遇到读写请求将返回错误信息OOM(Out of Memory)。为了预防这种情况,Redis 为内存回收提供了三个命令:
1、基于过期时间取消 key
2、基于 LRU (Least Recently Used)算法淘汰长时间未使用的键/值对
3、数据库压缩
二、Redis的内存回收进程
1、什么是Redis的内存回收进程?
Redis 的内存回收处理单独形成一个线程或者进程,在 Redis 中被称为“内存回收进程”(memory reclaiming thread/process)。Redis 首先在时间上进行判断,对那些已过期但是尚未被删除的 keys 进行标记,这样它们就可以在之后被立即释放并回收所占用的内存。
2、原理与操作流程
Redis 内存回收进程的基本原理是周期性地扫描存储数据库中所有的键,并一步步对所有键进行检测:
(1)、判断键是否已经过期
(2)、是否使用了LRU算法,以及它最后一次被访问的时间
(3)、是否被删除但仍然留在内存中(当多个客户端同时访问同一个 key VALUE 时,如果没有正确处理引用计数,则会发生这种情况)
首先检查是否有需要根据过期时间自动删除的键(expired key)。每次检查只对一小部分键进行处理。如果有符合条件的 key,内存回收线程就把它们标记为过期,在之后立即回收并释放为其分配的内存。
然后,Redis 检查那些没有被过期,但仍然占用大量内存的键。如果所选键比快满了,Redis 就选择其中最早要删除的几个键,并释放它们所占用的空间。
除了定期回收外,Redis 还支持手动释放 key VALUE 占用内存的方法:通过向 Redis 发送一个 flushall 命令和可使用“shutdown”断开连接的方式来清除所有数据。
三、总结
Redis 的内存管理主要依靠两个进程:内存回收进程和AOF持久化进程(如果打开). 在Redis中,所有键值都保存在内存中,如果内存满了,Redis将停止工作,同时遇到读写请求将返回错误信息OOM(OutOfMemory)。为了预防这种情况,Redis为内存回收提供了三个命令。
Redis的内存回收进程对Redis的性能以及数据安全都有很大的影响。谨慎编写和使用上述三个操作并对内存进行适度分配可以帮助我们充分利用Redis的高效性能,并确保数据不会被意外损坏或删除。在实际使用过程中,开发人员应该结合业务特点选择合适的手段进行规划和调整,以优化内部的性能。