java内存缓存实现 与 redis缓存实现 (ConcurrentHashMap 应用)

java 复制代码
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;

@Service
public class LocalCacheService {

    // 核心内存缓存容器(线程安全的ConcurrentHashMap)
    private final Map<String, Object> localCache = new ConcurrentHashMap<>();

    /**
     * 通用内存缓存获取方法
     * @param cacheKey 缓存键
     * @param dataLoader 数据加载器(缓存未命中时执行)
     * @return 缓存或加载的数据
     */
    public <T> T getFromLocalCache(String cacheKey, Supplier<T> dataLoader) {
        // 1. 从内存缓存获取数据
        @SuppressWarnings("unchecked")
        T data = (T) localCache.get(cacheKey);

        // 2. 缓存命中,直接返回
        if (data != null) {
            return data;
        }

        // 3. 缓存未命中,执行数据加载逻辑
        data = dataLoader.get();

        // 4. 加载成功后放入内存缓存
        if (data != null) {
            localCache.put(cacheKey, data);
        }

        return data;
    }

    /**
     * 主动清除指定缓存
     * @param cacheKey 缓存键
     */
    public void removeLocalCache(String cacheKey) {
        localCache.remove(cacheKey);
    }

    /**
     * 清空所有内存缓存(谨慎使用)
     */
    public void clearAllLocalCache() {
        localCache.clear();
    }
}

上面的是 内存缓存

下面的是 redis缓存

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.function.Supplier;

@Service
public class CacheService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 通用缓存获取方法
     * @param cacheKey 缓存键
     * @param dataLoader 数据加载器函数
     * @return 缓存或数据库中的数据
     */
    public <T> T getFromCache(String cacheKey, Supplier<T> dataLoader) {
        // 从缓存获取数据
        T data = (T) redisTemplate.opsForValue().get(cacheKey);

        if (data != null) {
            return data;
        }

        // 缓存未命中,加载数据
        data = dataLoader.get();

        if (data != null) {
            // 放入缓存(永不过期)
            redisTemplate.opsForValue().set(cacheKey, data);
        }

        return data;
    }
}

本文展示了两种缓存实现方案:1) 基于ConcurrentHashMap的本地内存缓存(LocalCacheService),提供线程安全的缓存操作,包含缓存查询、自动加载、单键清除和全部清除功能;2) Redis分布式缓存(CacheService),通过RedisTemplate实现,包含基本的缓存查询和自动加载功能。两种方案均采用Supplier接口实现&quot;缓存未命中时自动加载&quot;的模式,其中本地缓存适用于单机高频访问场景,Redis缓存适用于分布式环境。代码结构清晰,展示了Sprin

相关推荐
蛋蛋的就会顺顺的4 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8265 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡5 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
骇客野人5 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
伯恩bourne7 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_7 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs8 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲8 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户21296835261688 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm