三白草

注册

 

发新话题 回复该主题

聊聊缓存回收策略跟缓存更新策略 [复制链接]

1#
北京最好的白癜风医院电话 https://jbk.39.net/yiyuanzaixian/bjzkbdfyy/

互联网时代的飞速发展,用户的体验度是判断一个软件好坏的重要原因,所以缓存就是必不可少的一个神器。缓存的种类有很多,需要根据不同的应用场景来需要选择不同的cache,比如分布式缓存如redis跟本地缓存如Caffeine。今天简单聊聊缓存的回收策略跟更新策略。由于笔者自身水平有限,如果有不对或者任何建议欢迎批评和指正~

缓存回收策略

回收策略

1基于空间/p>

即设置缓存的,如设置为10MB,当达到存储空间时,按照一定的策略移除数据。

2基于容量/p>

指缓存设置了最大大小,当缓存的条目超过最大大小时,按照一定的策略移除数据。如CaffeineCache可以通过maximumSize参数设置缓存容量,当超出maximumSize时,按照算法进行缓存回收。

publicstaticvoidmaximumSizeTest(){CacheString,StringmaximumSizeCaffeineCache=Caffeine.newBuilder().maximumSize(1).build();maximumSizeCaffeineCache.put("A","A");Stringvalue1=maximumSizeCaffeineCache.getIfPresent("A");System.out.println("key:key1"+"value:"+value1);maximumSizeCaffeineCache.put("B","B");Stringvalue1AfterExpired=maximumSizeCaffeineCache.getIfPresent("A");//输出nullSystem.out.println("key:key1"+"value:"+value1AfterExpired);Stringvalue2=maximumSizeCaffeineCache.getIfPresent("B");//输出BSystem.out.println("key:key2"+"value:"+value2);}

3基于时间

TTL(TimeToLive):存活期,即缓存数据从创建开始直到到期的一个时间段(不管在这个时间段内有没有被访问,缓存数据都将过期)。

TTI(TimeToIdle):空闲期,即缓存数据多久没被访问后移除缓存的时间。

如CaffeineCache可以通过expireAfterWrite跟expireAfterAccess参数设置过期时间。

publicstaticvoidttiTest(){CacheString,StringttiCaffeineCache=Caffeine.newBuilder().maximumSize().expireAfterAccess(1,TimeUnit.SECONDS).build();ttiCaffeineCache.put("A","A");//输出ASystem.out.println(ttiCaffeineCache.getIfPresent("A"));try{Thread.sleep(0);}catch(InterruptedExceptione){e.printStackTrace();}//输出nullSystem.out.println(ttiCaffeineCache.getIfPresent("A"));}

回收算法

1FIFO:先进先出算法,即先放入缓存的先被移除。

流程/p>

优点:最简单、最公平的一种数据淘汰算法,逻辑简单清晰,易于实现

缺点:这种算法逻辑设计所实现的缓存的命中率是比较低的,因为没有任何额外逻辑能够尽可能的保证常用数据不被淘汰掉

2LRU

流程/p>

优点RU可以有效的对访问比较频繁的数据进行保护,也就是针对热点数据的命中率提高有明显的效果。

缺点:对于周期性、偶发性的访问数据,有大概率可能造成缓存污染,也就是置换出去了热点数据,把这些偶发性数据留下了,从而导致LRU的数据命中率急剧下降。

3LFU

流程/p>

优点FU也可以有效的保护缓存,相对场景来讲,比LRU有更好的缓存命中率。因为是以次数为基准,所以更加准确,自然能有效的保证和提高命中率

缺点:因为LFU需要记录数据的访问频率,因此需要额外的空间;当访问模式改变的时候,算法命中率会急剧下降,这也是他最大弊端。

4W-TinyLFU

流程:

优点:使用Count-MinSketch算法存储访问频率,极大的节省空间;定期衰减操作,应对访问模式变化;并且使用window-lru机制能够尽可能避免缓存污染的发生,在过滤器内部会进行筛选处理,避免低频数据置换高频数据。

缺点:暂未发现

缓存更新策略

Cache-Aside

1什么是CacheAsidePattern

旁路缓存方案的经验实践,这个实践又分读实践,写实践。该模式对缓存的

分享 转发
TOP
发新话题 回复该主题