Java实现本地缓存

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");

以上是实现思路,如有更好的办法或见解还望指正!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风亦思雨

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值