前置问题
- Q1、设置的 key 明明已经过期了,为啥 仍然占用内存?
- Q2、设置的 key 明明还没有过期,为啥 这个 key 就不见了?
这两个问题,通过 Redis 内存回收机制能够得到完美的解答。
Redis 内存回收机制
Redis 在两种情况下会回收 key 占用的内存:
- 用户主动设置过期时间,时间到了,被回收
- redis 中key达到了 redis 设置的 max_memory ,内存溢出。Redis 通过 LRU 算法进行Redis 内存回收。
1、删除达到过期时间的键对象
在 Redis 进程内保存了大量用户存入的 key ,针对设置了过期时间的 key ,如果每一个 key 进行精准的控制-当key过期立即回收空间,对于单线程的Reids来说成本太高。所以 Redis 中的 key 过期了,占用的内存空间并不会马上被回收, Redis 采用了两种方式:惰性删除和定时任务删除 来进行空间回收
-
惰性删除
当客户端进行某个 key 的get 访问,该key被设置了过期时间,如果此时 get 操作的时候 key 过期了,此时 Redis 将会针对该 key 占用的空间进行回收。
优点:该方式采用用户访问的方式进行空间回收,无需维护 key 的 TTL 链表数据。