Java实现类似Redis的本机带过期时间的缓存策略(ExpiringMap)

2022-01-22 75点热度 0人点赞 0条评论
标题内容

需求说明

一个简单的单体应用,需要一个类似Redis的带过期时间的缓存方案,不想增加系统依赖度而安装一个Redis服务,希望引入一个jar或者pom而实现这个类似Redis的功能。

考虑使用Java内置缓存方案

考虑到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

admin

这个人很懒,什么都没留下

文章评论

*

code