如果问到:假如Redis的key过期之后,会立即删除吗?
其实就是想问数据删除(过期)策略。
如果面试官问到:如果缓存过多,内存是有限的,内存被占满了怎么办?
其实就是问:数据的淘汰策略。
1.Redis的数据删除(过期)策略:
当Redis的key过期后,并不会立即删除。Redis使用以下两种策略来处理过期key的删除:
(1)惰性删除:
- 原理: 当客户端尝试访问一个key时,Redis会检查该key是否过期。如果过期,则立即删除。
- 优点: 节省CPU资源,只在访问时检查过期。
- 缺点: 如果过期key长时间未被访问,会占用内存。
(2)定期删除:
- 原理: Redis会定期随机抽取一部分key进行检查,删除其中过期的key。
- 优点: 减少内存占用,避免过期key长时间未被删除。
- 缺点: 可能会占用一定的CPU资源。
总结:
- Redis的过期key删除是惰性删除+定期删除的结合。
- 惰性删除确保访问时key是最新的,定期删除减少内存占用。
2.Redis的数据淘汰策略:
当Redis的内存被占满时,会根据配置的淘汰策略删除部分key以释放空间。以下几种淘汰策略:
(1)noeviction:
- 原理: 当内存不足时,新写入操作会报错,不删除任何key
- 适用场景: 对数据一致性要求极高的场景。
(2)allkeys-lru:
- 原理: 从所有key中删除 最近最少使用(Least Recently Used LRU)的key。
- 适用场景:适合大多数场景,优先保留最近使用的key。
(3)volatile-lru:
- 原理: 从设置了过期时间的key中删除 最近最少使用的key。
- 适用场景: 只淘汰过期key,适合需要保留永久数据的场景。
(4)allkeys-random:
- 原理: 从所有key中随机删除key。
- 适用场景: 适合key访问模式随机的场景。
(5)volatile-random:
- 原理: 从设置了过期时间的key中随机删除key。
- 适用场景: 只淘汰过期key,适合需要保留永久数据的场景。
(6)volatile-ttl:
- 原理: 从设置了过期时间的key中删除剩余生存时间(TTL)最短的key。
- 适用场景: 优先淘汰即将过期的key。
总结:
- 常用策略:allkeys-lru 和volatile-lru是最常用的淘汰策略。
3.应用场景:
3.1场景1:缓存系统
- 需求: 优先保留最近使用的数据。
- 策略: 使用allkeys-lru
3.2场景2: 会话系统
- 需求: 只淘汰过期回话数据。
- 策略: 使用volatile-lru和volatile-ttl
3.3随机访问模式:
- 需求: 数据访问模式随机。
- 策略: 使用allkeys-random