Web 项目的缓存策略

策略一:读填写删


缺点:如果执行顺序是B1B2、A1A2、B3,那么就出现cache和db数据不一致(即“过期写入”)

策略二:B站策略


这样就不会出现策略一的情况了。但是线程A可能出现A2执行失败的情况,可以通过MQ任务来重试。
B站这里通过数据库binlog的异步队列来再次写cache。

策略三:cache版本号


每次写cache的时候有一个版本号,版本号可以用db的最后修改时间。
这样在执行顺序是B1B2、A1A2、B3时,执行B3的时候检查cache的现有版本号,发现比它小则不写cache。
但是同样会有策略二的问题。

策略四:Facebook策略

在策略一的基础上有如下规则:

  • 线程B在cacheMiss后会得到一个lease,在步骤3写cache的时候带上
  • 多个线程在对同一个key的cacheMiss,10秒内只有一个线程得到lease
  • 只有带lease的客户端才能写cache
  • 同一个key在被删除后,删除操作之前的lease无效,重新发放lease(key并没有真正删除,这样没有得到lease的线程可以读旧数据)

同样会有策略二的问题。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!