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 协议》,转载必须注明作者和本文链接