发布网友 发布时间:2022-04-25 19:15
共1个回答
热心网友 时间:2022-04-28 11:43
为什么使用缓存
大家在使用各式各样的数据检索服务时,可能都会面临一个共性的问题:系统变得越来越慢。互联网有一个8秒原则:用户打开一个网页最高能容忍的时长是8秒,抛开网络时延和下载静态文件的耗时,对检索的性能要求非常高。我们面临的问题:随着数据量的增大检索性能越来越差,数据库中存在着大量沉寂已久的数据,严重的冷热数据分布不均。这种场景下引入“缓存”是非常适合的。
01 | 缓存策略
1)LRU(Least recently used)最近最少使用,根据数据的历史访问记录来进行淘汰数据,核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降。
2)LFU(Least Frequently Used)最近最频繁使用,根据数据的访问频次进行淘汰数据,核心思想是“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”。
LFU和LRU算法的不同之处在于LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的。为了能够淘汰最少使用的数据,LFU算法针对每条数据记录了一个访问频次,当数据项被命中时,访问频次自增,然后定期淘汰访问频次低的数据。
如何选择策略,何时进行缓存,何时淘汰数据,一定跟我们的业务紧密相关的。这里以redis做缓存服务为例,给大家介绍几种基于LRU的cache实现方案。
读操作时,首先从cache里读数据,若读不到,则从数据库里读数据,然后将读到的内容写到cache里,并为这条数据设置了一个过期时间,当下次请求同样的数据时将直接命中缓存。
这应该是大部分人都会选择的方案,不过方案存在“第一次访问”的问题,刚才说到当第一次访问没有命中到缓存时,会有两次读操作和一次写操作,要比直接查数据库慢。不过理论上来讲,如果数据的修改不多,热点数据非常集中,就可以让大部分热数据常驻缓存中,缓存命中率会保持在一个较高的水平,收益很明显。
对于方案A,有人会问为什么在写数据的时候选择淘汰旧数据,而不是直接将缓存中的数据更新呢?如下图,直接更新并没有增加什么成本却可以提高缓存的命中率,这样做的基础是:用户修改的数据被检索的概率也很高。