你应该知道的缓存进化史( 五 )

你应该知道的缓存进化史
文章插图
 
 

  1. 所有的新数据都会进入Eden 。
  2. Eden满了,淘汰进入Probation 。
  3. 如果在Probation中访问了其中某个数据,则这个数据升级为Protected 。
  4. 如果Protected满了又会继续降级为Probation 。
对于发生数据淘汰的时候,会从Probation中进行淘汰,会把这个队列中的数据队头称为受害者,这个队头肯定是最早进入的,按照LRU队列的算法的话那他其实他就应该被淘汰,但是在这里只能叫他受害者,这个队列是缓刑队列,代表马上要给他行刑了 。这里会取出队尾叫候选者,也叫攻击者 。这里受害者会和攻击者做PK,通过我们的Count-Min Sketch中的记录的频率数据有以下几个判断:
  • 如果攻击者大于受害者,那么受害者就直接被淘汰 。
  • 如果攻击者<=5,那么直接淘汰攻击者 。这个逻辑在他的注释中有解释:

你应该知道的缓存进化史

文章插图
 
  • 他认为设置一个预热的门槛会让整体命中率更高 。
  • 其他情况,随机淘汰 。
6.5、如何使用
对于熟悉Guava的玩家来说如果担心有切换成本,那么你完全就多虑了,caffeine的api借鉴了Guava的api,可以发现其基本一模一样 。
你应该知道的缓存进化史

文章插图
 
 
顺便一提的是,越来越多的开源框架都放弃了Guava cache,比如Spring5 。在业务上我也自己曾经比较过Guava cache和caffeine最终选择了caffeine,在线上也有不错的效果 。所以不用担心caffeine不成熟,没人使用 。
7、最后本文主要讲了爱奇艺的缓存之路和本地缓存的一个发展历史(从古至今到未来),以及每一种缓存的实现基本原理 。当然要使用好缓存光是这些仅仅不够,比如本地缓存如何在其他地方更改了之后同步更新,分布式缓存,多级缓存等等 。




推荐阅读