标题内容
需求说明
一个简单的单体应用,需要一个类似Redis的带过期时间的缓存方案,不想增加系统依赖度而安装一个Redis服务,希望引入一个jar或者pom而实现这个类似Redis的功能。
考虑使用Java内置缓存方案
- ExpiringMap https://github.com/jhalterman/expiringmap
- Google Guava Cache https://github.com/google/guava/wiki/CachesExplained
考虑到Guava依赖包有点多(会依赖),暂时部署不方便,如图,实际依赖有6个:
先用ExpiringMap(实际只需要增加expiringmap.jar)
ExpiringMap的使用
引入pom.xml
<dependency>
<groupId>net.jodah</groupId>
<artifactId>expiringmap</artifactId>
<version>0.5.10</version>
</dependency>
使用举例:
// 这个cache1可以存多种不同过期时间的内容
ExpiringMap<String, String> cache1 = ExpiringMap.builder().variableExpiration().build();
cache1.put("some_key", "some_value", 1, TimeUnit.DAYS); // 往cache里存一天
cache1.put("some_key", "some_value", ExpirationPolicy.ACCESSED, 5, TimeUnit.MINUTES); //按照访问时间来算过期策略,比如最近访问过,过期时间重新开始计算
// 这个cache可以固定过期时间,固定大小(数量)
Map<String, Connection> cache2 = ExpiringMap.builder()
.maxSize(10)
.expiration(30, TimeUnit.SECONDS)
.build();
// 30秒过或者第11个存入后,就失效了
cache2.put("connection", connection);
//可以设置过期策略
cache2.setExpirationPolicy("some_key", ExpirationPolicy.CREATED); //按照生成时间来算过期策略
cache2.setExpirationPolicy("some_key", ExpirationPolicy.ACCESSED); //按照访问时间来算过期策略,比如最近访问过,过期时间重新开始计算
//获得某个key的过期时间, 单位毫秒数
long expiration = cache2.getExpiration("some_key");
//重置过期时间,按照原来设置的算
cache2.resetExpiration("some_key");
更多详细的例子,例如过期监听等等,可以参考:https://github.com/jhalterman/expiringmap

文章评论