标题内容
需求说明
一个简单的单体应用,需要一个类似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
文章评论