Redis缓存作为常见的缓存应用,分布广泛,但有时候我们的系统根本不需要使用Redis或者其他第三方缓存软件,因为系统功能比较简单,尤其在缓存内容这块。所以,该文章将向你介绍,如何使用简单的系统内存作为缓存工具,替代Redis实现缓存功能。
主要使用ConcurrentHashMap和ScheduledExecutorService类,Java类中导入依赖语句:
import java.util.concurrent.*;
Service层写法
接口类:
public interface SimpleMemoryCacheService<K, V> {
V get(K key);
void put(K key, V value, long expireAfterAccessMillis);
void remove(K key);
void shutdown();
}
实现类:
@Service
public class SimpleMemoryCacheServiceImpl<K, V> implements SimpleMemoryCacheService<K, V> {
private final ConcurrentHashMap<K, CacheObject<V>> cache = new ConcurrentHashMap<>();
private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
public V get(K key) {
CacheObject<V> cacheObject = cache.get(key);
if (cacheObject != null) {
cacheObject.setLastAccessTime(System.currentTimeMillis());
return cacheObject.getValue();
}
return null;
}
public void put(K key, V value, long expireAfterAccessMillis) {
CacheObject<V> cacheObject = new CacheObject<>(value, System.currentTimeMillis(), expireAfterAccessMillis);
cache.put(key, cacheObject);
executorService.schedule(() -> cleanup(key), expireAfterAccessMillis, TimeUnit.MILLISECONDS);
}
public void remove(K key) {
cache.remove(key);
}
private void cleanup(K key) {
CacheObject<V> cacheObject = cache.get(key);
if (cacheObject != null && System.currentTimeMillis() - cacheObject.getLastAccessTime() > cacheObject.getExpireAfterAccessMillis()) {
cache.remove(key);
}
}
public void shutdown() {
executorService.shutdown();
}
private static class CacheObject<V> {
private V value;
private long lastAccessTime;
private long expireAfterAccessMillis;
CacheObject(V value, long lastAccessTime, long expireAfterAccessMillis) {
this.value = value;
this.lastAccessTime = lastAccessTime;
this.expireAfterAccessMillis = expireAfterAccessMillis;
}
public V getValue() {
return value;
}
public long getLastAccessTime() {
return lastAccessTime;
}
public void setLastAccessTime(long lastAccessTime) {
this.lastAccessTime = lastAccessTime;
}
public long getExpireAfterAccessMillis() {
return expireAfterAccessMillis;
}
}
}
至此,基本完成,下面简单说明使用方法。
在你的控制类或者其他业务层服务类中注入:
@Autowired
private SimpleMemoryCacheService simpleMemoryCacheService;
在你的代码中使用:
//往内存里添加缓存 参数:key,value,过期时间(值为Long.MAX_VALUE时永不过期)
simpleMemoryCacheService.put("nameXXX", "张三", Long.MAX_VALUE);
//往内存里添加缓存 参数:key,value,过期时间(五分钟后过期)
simpleMemoryCacheService.put("yzm", "XF168A", 300000);
//获取缓存内容 参数:key
Object obj = simpleMemoryCacheService.get("yzm");
//移除内存中某个缓存内容 参数:key
simpleMemoryCacheService.remove("nameXXX");