Redis的缓存更新策略主要分为内存溢出淘汰策略、过期策略以及应用方主动更新策略。
内存溢出淘汰策略:当Redis内存使用达到上限(maxmemory)时,会触发淘汰机制,具体策略由maxmemory-policy参数控制,支持6种模式:
- noeviction:默认策略,拒绝写入操作,仅响应读请求。
- volatile-lru:基于LRU算法淘汰设置了过期时间的键,若无可淘汰键则回退至noeviction。
- volatile-random:随机淘汰过期键。
- allkeys-lru:基于LRU算法淘汰所有键(无论是否设置过期时间)。
- allkeys-random:随机淘汰所有键(不推荐,可能导致重要数据丢失)。
- volatile-ttl:优先淘汰剩余生存时间(TTL)最短的键,若无可淘汰键则回退至noeviction。
LRU算法通过维护键的最近访问时间戳,淘汰最久未使用的数据。动态配置可通过config set maxmemory-policy {policy}实现,但需注意主从架构中删除操作同步可能引发写放大问题。
过期策略:采用惰性删除+定期删除的混合模式:
- 惰性删除:客户端访问键时检查是否过期,若过期则删除并返回空。此策略节省CPU资源,但可能因长期未访问导致内存泄漏。
- 定期删除:Redis默认每秒运行10次(通过hz参数配置)自适应扫描任务,每次随机抽取20个键删除过期项。若过期比例超过25%,则重复扫描。为避免阻塞服务,设置25毫秒超时限制,超时后切换至快速模式(1毫秒超时且2秒内仅运行1次)。
应用方主动更新策略:
- Cache Aside模式:应用先查缓存,未命中则从数据库加载并写入缓存。
- 先删缓存再更新数据库:存在并发读导致脏数据问题(删除缓存后,读请求可能加载旧数据回缓存)。
- 先更新数据库再删缓存(推荐):避免并发写导致脏数据,但需处理删除缓存失败的情况(可通过重试或消息队列保证最终一致性)。直接更新缓存而非删除可能导致两个并发写操作产生脏数据,因此删除缓存更安全。