缓存的更新
缓存的数据一般都是有生命时间的,过了一段时间之后就会失效,再次访问时需要重新加载。缓存的失效是为了保证与数据源真实的数据保证一致性和缓存空间的有效利用性。下面将从使用场景、数据一致性、开发运维维护成本三个方面来介绍几种缓存的更新策略。
1、LRU/LFU/FIFO
这三种算法都是属于当缓存不够用时采用的更新算法。只是选出的淘汰元素的规则不一样:LRU淘汰最近没有被访问过的,LFU淘汰访问次数最少的,FIFO先进先出。
一致性:要清理哪些数据是由具体的算法定的,开发人员只能选择其中的一种,一致性差。
开发维护成本:算法不需要开发人员维护,只需要配置最大可使用内存即可,然后选择淘汰算法即可,故成本低。
使用场景:适合内存空间有限,数据长期不变动,基本不存在数据一不致性业务。比如一些一经确定就不允许变更的信息。
2、超时剔除
给缓存数据手动设置一个过期时间,比如Redis expire命令。当超过时间后,再次访问时从数据源重新加载并设回缓存。
一致性:主要处决于缓存的生命时间窗口,这点由开发人员控制。但仍不能保证实时一致性,估一致性一般。
开发维护成本:成本不是很高,很多缓存系统都自带过期时间API。比如Redis expire
使用场景:适合于能够容忍一定时间内数据不一致性的业务,比如促销活动的描述文案。
3、主动更新
如果数据源的数据有更新,则主动更新缓存。
一致性:三者当中一致性最高,只要能确定正确更新,一致性就能有保证。
开发维护成本:这个相对来说就高了,**业务数据更新与缓存更新藕合了一起。需要处理业务数据更新成功,而缓存更新失败的情景,**为了解耦一般用来消息队列的方式更新。不过为了提高容错性,一般会结合超时剔除方案,避免缓存更新失败,缓存得不到更新的场景。
使用场景:对于数据的一致性要求很高,比如交易系统,优惠劵的总张数。
所以总的来说缓存更新的最佳实践是:
低一致性业务:可以选择第一并结合第二种策略。
高一