Java实现本地缓存主要还是适用于单体应用,且服务一旦重启,数据都将丢失。
先创建一个缓存类,主要是存放数据和缓存时间,该类的内容或属性可以根据业务自行添加。
@Data
public class MyCache {
/**
* 缓存内容
*/
public String value;
/**
* 过期时间 -1表示永不过期
*/
public long time;
public MyCache() {
this.value = null;
this.time = -1;
}
public MyCache(String value) {
this.value = value;
this.time = -1;
}
public MyCache(String value, long time) {
this.value = value;
this.time = time;
}
}
接下来编写操作数据的缓存结构工具类,要实现一个简单的本地缓存,我们可以使用Java的ConcurrentHashMap,它是一个线程安全的集合,适合在多线程环境中使用。下面是一个简单的Java实现,没有使用Spring Cache,但可以作为基础来理解缓存的工作原理
public class LocalCacheUtils {
/**
* 本地缓存实现
*/
public static final Map<String, MyCache> LOCAL_CACHE = new ConcurrentHashMap<>();
/**
* 设置缓存
* @param key
* @param value
*/
public static void set(String key, String value) {
LOCAL_CACHE.put(key, new MyCache(value));
}
/**
* 设置过期时间缓存
* @param key
* @param value
* @param timeout 1day:1000 * 60 * 60 * 24
*/
public static void set(String key, String value, long timeout) {
LOCAL_CACHE.put(key, new MyCache(value, System.currentTimeMillis() + timeout));
}
/**
* 获取缓存
* @param key
* @return
*/
public static String get(String key) {
MyCache myCache = LOCAL_CACHE.get(key);
// 获取该键是否有值
if (myCache == null) {
return null;
}
// 查看是否设置过期时间
long cacheTime = myCache.getTime();
// 判断缓存是否过期
if (cacheTime > 0 && cacheTime < System.currentTimeMillis()) {
// 已过期,删除数据,返回空
del(key);
return null;
}
return myCache.getValue();
}
/**
* 删除缓存
* @param key
*/
public static void del(String key) {
LOCAL_CACHE.remove(key);
}
/**
* 清空缓存
*/
public static void clear() {
LOCAL_CACHE.clear();
}
}
写好两个类之后,可以进行测试了,在服务controller里面加一个测试方法,或写一个测试方法,验证数据;
// 类外部调用示例
LocalCacheUtils.set("key1", "value1");
LocalCacheUtils.set("key2", "value2", 1000 * 20);
LocalCacheUtils.get("key1"); // 可以在此处打断点等20秒查看
LocalCacheUtils.get("key2");
以上是实现思路,如有更好的办法或见解还望指正!