首页 > 编程语言 >Java中的多级缓存设计与实现

Java中的多级缓存设计与实现

时间:2024-07-20 15:55:02浏览次数:13  
标签:缓存 Java String 多级 value key import public

Java中的多级缓存设计与实现

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

在现代应用程序中,多级缓存设计是一种常见的性能优化技术。多级缓存通过在不同层次上缓存数据来减少对底层存储系统的访问次数,提高系统的整体性能。本文将展示如何在 Java 中设计和实现一个多级缓存系统,包括内存缓存和分布式缓存的组合。

1. 设计多级缓存

多级缓存通常包括以下几层:

  1. 本地缓存(L1):直接在应用程序中存储的缓存,如使用 HashMapConcurrentHashMapCaffeine 等工具实现。
  2. 分布式缓存(L2):如 Redis 或 Memcached,这种缓存可供多个应用程序实例共享。

2. 添加依赖

首先,在 pom.xml 中添加需要的依赖:

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>2.9.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3. 本地缓存实现

我们可以使用 Caffeine 作为本地缓存的实现。以下是一个使用 Caffeine 实现的本地缓存示例:

package cn.juwatech.cache;

import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.Cache;
import org.springframework.stereotype.Component;

@Component
public class LocalCache {

    private final Cache<String, String> cache;

    public LocalCache() {
        this.cache = Caffeine.newBuilder()
                             .maximumSize(100) // 最大缓存项数
                             .expireAfterWrite(10, java.util.concurrent.TimeUnit.MINUTES) // 10分钟后过期
                             .build();
    }

    public void put(String key, String value) {
        cache.put(key, value);
    }

    public String get(String key) {
        return cache.getIfPresent(key);
    }
}

在这个例子中,我们创建了一个最大缓存项数为 100,且每项在写入后 10 分钟过期的 Caffeine 缓存实例。

4. 分布式缓存实现

Redis 是一种流行的分布式缓存解决方案。配置 Redis 客户端(例如 Jedis 或 Lettuce)并进行连接:

spring:
  redis:
    host: localhost
    port: 6379

接着,创建一个 Redis 缓存管理器:

package cn.juwatech.cache;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class RedisCache {

    private final RedisTemplate<String, String> redisTemplate;

    @Autowired
    public RedisCache(RedisConnectionFactory redisConnectionFactory) {
        this.redisTemplate = new RedisTemplate<>();
        this.redisTemplate.setConnectionFactory(redisConnectionFactory);
    }

    public void put(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

5. 多级缓存策略

在实现多级缓存时,我们需要一个机制来协调本地缓存和分布式缓存。以下是一个示例实现,展示了如何使用本地缓存作为第一级缓存,当本地缓存中不存在数据时,从分布式缓存中加载数据:

package cn.juwatech.cache;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MultiLevelCacheService {

    private final LocalCache localCache;
    private final RedisCache redisCache;

    @Autowired
    public MultiLevelCacheService(LocalCache localCache, RedisCache redisCache) {
        this.localCache = localCache;
        this.redisCache = redisCache;
    }

    public String get(String key) {
        // 尝试从本地缓存中获取数据
        String value = localCache.get(key);
        if (value != null) {
            return value;
        }

        // 本地缓存中没有,从 Redis 中获取
        value = redisCache.get(key);
        if (value != null) {
            // 更新本地缓存
            localCache.put(key, value);
        }

        return value;
    }

    public void put(String key, String value) {
        // 更新本地缓存和 Redis
        localCache.put(key, value);
        redisCache.put(key, value);
    }
}

在这个实现中,MultiLevelCacheService 类负责协调本地缓存和 Redis 缓存。当请求数据时,它首先尝试从本地缓存中获取数据,如果本地缓存中不存在数据,则从 Redis 中获取,并将数据放入本地缓存中。

6. 示例控制器

最后,我们可以创建一个控制器来展示如何使用这个多级缓存服务:

package cn.juwatech.controller;

import cn.juwatech.cache.MultiLevelCacheService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CacheController {

    private final MultiLevelCacheService multiLevelCacheService;

    public CacheController(MultiLevelCacheService multiLevelCacheService) {
        this.multiLevelCacheService = multiLevelCacheService;
    }

    @GetMapping("/cache")
    public String getCache(@RequestParam String key) {
        return multiLevelCacheService.get(key);
    }

    @GetMapping("/cache/put")
    public String putCache(@RequestParam String key, @RequestParam String value) {
        multiLevelCacheService.put(key, value);
        return "Cached " + key + " with value " + value;
    }
}

在这个控制器中,我们提供了两个端点,一个用于获取缓存数据,另一个用于将数据存储到缓存中。

7. 总结

通过以上步骤,我们在 Java 中实现了一个多级缓存系统,包括本地缓存和分布式缓存。使用 Caffeine 实现本地缓存,Redis 作为分布式缓存,并通过协调这两者来优化缓存性能。这种设计使得系统能够在减少对底层存储系统访问的同时,提高响应速度和处理能力。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

标签:缓存,Java,String,多级,value,key,import,public
From: https://www.cnblogs.com/szk123456/p/18313204

相关文章

  • Java中的异步编程与CompletableFuture应用
    Java中的异步编程与CompletableFuture应用大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代Java编程中,异步编程变得越来越重要,它可以帮助我们提高应用程序的响应速度和性能。CompletableFuture是Java8引入的一个强大工具,它简化了异步编程,使得......
  • 使用Java和Google Guava简化开发
    使用Java和GoogleGuava简化开发大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!GoogleGuava是Google开发的一个Java开源库,它提供了许多工具和库来简化Java开发。Guava提供了从集合类到缓存、字符串处理、并发工具等多种功能。本篇文章将介绍如......
  • 使用Java和Spring MVC构建Web应用
    使用Java和SpringMVC构建Web应用大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代企业中,Web应用程序是最常见的应用类型之一。SpringMVC是一个强大且流行的JavaWeb框架,用于构建功能强大且易于维护的Web应用程序。本文将通过实际示例展示如......
  • Java中的编译器插件开发与应用
    Java中的编译器插件开发与应用大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java语言中,编译器插件的开发与应用是一种高级编程技术,能够扩展Java编译器的功能,以满足特定的需求。这些插件可以在编译过程中进行代码分析、优化,甚至修改源代码。本文将......
  • 使用Java和Elastic Stack进行日志分析
    使用Java和ElasticStack进行日志分析大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代企业中,日志分析是确保系统健康、进行故障排查和优化性能的重要环节。ElasticStack(ELKStack)是一个强大的工具集,包含Elasticsearch、Logstash和Kibana,能够有......
  • 一周学完Java基础,第六天,常见容器
    (1)列表List         接口:    java.util.List<>    实现方式:    java.util.ArrayList<>:变长数组    java.util.LinkedList<>:双链表    函数:    add():在末尾添加一个元素    clear():......
  • 学生Java学习路程-3
    ok,到了一周一次的总结时刻,我大致会有下面几个方面的论述:1.这周学习了Java的那些东西2.这周遇到了什么苦难3.未来是否需要改进方法等几个方面阐述我的学习路程。这周首先就是进行了for循环跟while的一些练习,主要学习的方面在Scanner的学习,这是网上以及网课建议新手用的输入形式,以......
  • JavaScript Program to print pyramid pattern (打印金字塔图案的程序)
     编写程序打印由星星组成的金字塔图案 例子: 输入:n=6输出:    *    **    ***    ****    *****    ******     *****    ****    ***    **    ......
  • Javascript 在我的本地服务器上运行,但在 WordPress 上不起作用
    大家好,我有一个问题。我有一个在本地服务器中完美运行的模板/主题,但是当我将其移动到Wordpress时,根据我的研究,我得到了“jQuery不兼容”的信息。 我附上了代码的图像。你能帮我一下吗,一切看起来都很完美,在我看来一切都很完美,但在Wordpress中却不然。提前谢谢你!......
  • Java基础语法(一)
    目录一、Java入门 java定义前期准备Java应用java的主要特性JDK和JRE二、Java基础概念注释关键字关键字特点字面量分类特殊的字面量\t变量数据类型标识符键盘录入Scanner类三、运算符四、循环和判断五、数组六、方法一、Java入门 java定义  ......