Redis内存策略
1. 过期 key 处理
Redis 之所以性能强,最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大,会影响持久化或主从同步性能。
我们可以通过修改配置文件来设置 Redis 的最大内存:
maxmemory 1gb
当内存使用达到上 限时,就无法存储更多数据了。为了解决这个问题,Redis 提供了一些策略实现内存回收:
先要了解的是:redis 是一个存储键值数据库系统,那它源码中是如何存储所有键值对的呢?
Redis 本身是一个典型的 key-value 内存存储数据库,因此所有的 key、value 都保存在之前学习过的 Dict 结构中。不过在其 database 结构体中,有两个 Dict:一个用来记录 key-value;另一个用来记录 key-TTL。
- dict 是 hash 结构,用来存放所有的 键值对
- expires 也是 hash 结构,用来存放所有设置了 过期时间的 键值对,不过它的 value 值是过期时间
这里有两个问题需要我们思考:
- Redis 是如何知道一个 key 是否过期呢?
- 利用两个 Dict 分别记录 key-value 对及 key-ttl 对,是不是 TTL 到期就立即删除了呢?
总结:Redis 的过期删除策略就是:惰性删除和定期删除两种策略配合使用
惰性删除
惰性删除:顾明思议并不是在 TTL 到期后就立刻删除,而是在访问一个 key 的时候,检查该 key 的存活时间,如果已经过期才执行删除。