缓存
<h1><center>缓存</center></h1>
<p>互联网软件神速发展,用户的体验度是判断一个软件好坏的重要原因,所以缓存就是必不可少的一个神器。在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场景来需要选择不同的cache,比如分布式缓存如redis、memcached,还有本地(进程内)缓存如ehcache、GuavaCache、Caffeine。</p>
<p>说起Guava Cache,很多人都不会陌生,它是Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。由于Guava的大量使用,Guava Cache也得到了大量的应用。但是,Guava Cache的性能一定是最好的吗?也许,曾经,它的性能是非常不错的。但所谓长江后浪推前浪,总会有更加优秀的技术出现。接下来介绍一个比Guava Cache性能更高的缓存框架:Caffeine。
下面是读取性能:
<img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/21f099698505a9dbfc43183be9f458f5?showdoc=.jpg" alt="" />
详细信息可以查看:<a href="https://github.com/ben-manes/caffeine/wiki/Benchmarks">Benchmarks</a></p>
<p>nutz集成了 后 使用注解就可以轻松使用 省去 很多麻烦的配置
配置 resources下面的<code>application.properties</code>加入以下语句</p>
<pre><code># cache.缓存名称=缓存最大数量,最大空闲时间,最大存活时间
caffeine.cache.live3s=100,0,3000
# 也可以这样配置,配置项分别为:maxSize, maxIdle, maxLive
caffeine.cache.idel3s.maxSize=100
caffeine.cache.idel3s.maxIdle=3000</code></pre>
<p>使用方法</p>
<pre><code> @Ok("raw")
@At("/time/now")
@Cache
public String now() {
return "刷新试试,我动算我输,╭(╯^╰)╮ "+System.currentTimeMillis();
}
@Ok("raw")
@At("/time/live3s")
@Cache("live3s")
public String live10s() {
return "刷新试试,我每3秒变一下,俗称 “活不过3秒”,╭(╯^╰)╮ "+System.currentTimeMillis();
}
@Ok("raw")
@At("/time/idel3s")
@Cache("idel3s")
public String idel10s() {
return "3秒不续命,我就玩完 ╭(╯^╰)╮ "+System.currentTimeMillis();
}
public static void main(String[] args) throws Exception {
new NbApp().setPrintProcDoc(true).run();
}</code></pre>
<p>本项目中 实现 UpdateStrategy 接口 实现更新缓存 代码如下</p>
<pre><code>package org.nutz.boot.starter.caffeine;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.mvc.Mvcs;
/**
* caffeine 更新缓存方法 实现
* @Author: Haimming
* @Date: 2019-08-08 09:40
* @Version 1.0
*/
@IocBean
public class MvcUpdateStrategy implements UpdateStrategy {
/**
* 凡是request中携带update=true,都强制更新缓存
* @param key
* @return
*/
@Override
public boolean shouldUpdate(String key) {
return Lang.parseBoolean(Mvcs.getReq().getParameter("update"));
}
}
</code></pre>