Redis缓存一致性
双删机制的具体步骤
- 第一次删除缓存:
- 先删除缓存中的数据,以防止接下来的数据库更新操作读取到旧数据。
- 更新数据库:
- 进行数据库的更新操作,将数据更新到最新状态。
- 延迟一定时间后再次删除缓存:
- 第二次删除缓存是在数据库更新操作完成后进行的,并且通常会引入一个短暂的延时。这是为了确保在高并发情况下,任何其他线程在第一次删除缓存和数据库更新之间读取到的旧数据在短时间内也会被再次删除。
Redis缓存失效机制
- 定期删除(Scheduled Deletion):
- Redis 默认每隔 100 毫秒会随机抽取一些设置了过期时间的 key,检查它们是否过期,若过期则删除。
- 这种机制确保了过期的 key 能够及时被删除,但不保证能按时删除所有过期的 key。
- 惰性删除(Lazy Deletion):
- 当客户端访问某个 key 时,Redis 会检查该 key 是否已过期,若过期则删除该 key 并返回不存在的结果。
- 这种方式有效地减少了非必要的检查,但可能导致内存的浪费,因为过期的 key 只有在被访问时才会被删除。
- 内存淘汰机制(Eviction Policy):
- 当 Redis 的内存使用达到配置的 maxmemory 限制时,会根据配置的淘汰策略来删除一些 key 以释放内存。常见的淘汰策略包括:
- noeviction: 不删除任何 key,直接返回错误。
- allkeys-lru: 基于 LRU(最近最少使用)算法删除所有 key(不论是否有过期时间)。
- volatile-lru: 基于 LRU 算法删除设置了过期时间的 key。
- allkeys-random: 随机删除所有 key。
- volatile-random: 随机删除设置了过期时间的 key。
- volatile-ttl: 删除那些设置了过期时间且 TTL(存活时间)最短的 key。
- 当 Redis 的内存使用达到配置的 maxmemory 限制时,会根据配置的淘汰策略来删除一些 key 以释放内存。常见的淘汰策略包括:
- 主动删除(Active Expiration):
- 除了定期删除和惰性删除,Redis 还会在特定条件下主动执行删除操作。例如,在执行某些命令时,Redis 会顺带检查一些 key 的过期时间并删除过期的 key。