说起缓存,首先映入我们脑海的好像有很多种,比如说java自带的map,业界流行的分布式缓存服务器redis,其实还有mc了,但是mc很少用到,至少自己从未用到过,了解一下就可以了,有的时候,你知道的仅仅需要了解,因为你压根用不到他们,但是我今天要分享的与这种没有一点关系。
今天自己分享的是谷歌提供的一个自带过期时间的map,为啥要分享这篇文章呢,又是自己的一次总结,因为分配给自己的需求里面就是在单机版的服务进行任务的完成,但是当时自己用了另外一个方法去做,但是多人的情况下就出现了问题,所以后来就用到接下来要分享的map了。
首先,我们需要在自己的项目maven的pom文件加上下面的依赖。
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.1-jre</version>
</dependency>
接下来,就是需要用谷歌提供的方法进行看下如何使用自带过期时间的map使用了,我这里仅分享一下如何使用这个map的方法咯,其实很简单的。
package com.wpw.learnlearn;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import lombok.*;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import java.time.Duration;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
@Slf4j
public class Test2 {
public static void main(String[] args) {
Cache<Object, Object> objectObjectCache = CacheBuilder.newBuilder().expireAfterAccess(Duration.ofMinutes(1)).build();
ConcurrentMap<Object, Object> objectObjectConcurrentMap = objectObjectCache.asMap();
objectObjectConcurrentMap.put("test", new User().setName("w").setAge(1));
Set<Object> keySet = objectObjectConcurrentMap.keySet();
Set<Object> objectSet = new HashSet<>(keySet);
objectSet.forEach(System.out::println);
System.out.println("objectObjectConcurrentMap.getOrDefault(\"test\",\"key对应的值已过期\") = " + objectObjectConcurrentMap.getOrDefault("test", "key对应的值已过期"));
try {
TimeUnit.MINUTES.sleep(1);
} catch (InterruptedException e) {
log.info("堆栈信息:{}", e);
}
Set<Object> keySet1 = objectObjectConcurrentMap.keySet();
Set<Object> objectSet1 = new HashSet<>(keySet1);
objectSet1.forEach(System.out::println);
System.out.println("objectObjectConcurrentMap = " + objectObjectConcurrentMap.getOrDefault("test", "key对应的值已过期,这是默认值"));
}
@Data
@Accessors(chain = true)
@Builder
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
private static class User {
private String name;
private Integer age;
}
}
运行上面的示例程序,我们可以看到下面的日志信息。
test
objectObjectConcurrentMap.getOrDefault("test","key对应的值已过期") = Test2.User(name=w, age=1)
objectObjectConcurrentMap = key对应的值已过期,这是默认值
Process finished with exit code 0
其实,上面的示例程序现在以我自己总结出来自己的实现过程,在我自己看来还是很实用的,至少它在某些方面帮助了自己很多,为啥要分享出来呢,我倒是希望当那天你遇到了一个类似的需求,发现这篇文章可以帮助到你,或者其他人,或许会觉得开心了起来。