嚴華 发表于 2025-3-8 05:09:12

Spring Boot 本地缓存工具类计划与实现

在 Spring Boot 应用中,缓存是提升性能的重要手段之一。为了更方便地利用缓存,我们可以计划一套通用的本地缓存工具类,封装常见的缓存操作,简化开发流程。本文将具体先容怎样计划并实现一套 Spring Boot 本地缓存工具类,并提供完整代码示例。
1. 工具类计划目标

在计划缓存工具类时,我们需要思量以下目标:

[*]通用性:工具类应支持多种缓存操作,如获取、添加、更新、删除等。
[*]易用性:通过简朴的 API 调用即可完成缓存操作,减少重复代码。
[*]机动性:支持自界说缓存过期时间、缓存键生成战略等。
[*]可扩展性:工具类应易于扩展,支持不同的缓存实现(如 Caffeine、Guava 等)。
2. 工具类实现

2.1 添加依赖

首先,在 pom.xml 中添加 Spring Boot 缓存支持的依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>
2.2 启用缓存

在 Spring Boot 启动类上添加 @EnableCaching 注解,启用缓存功能:
@SpringBootApplication
@EnableCaching
public class MyApplication {
    public static void main(String[] args) {
      SpringApplication.run(MyApplication.class, args);
    }
}
2.3 缓存工具类实现

以下是一个通用的本地缓存工具类实现,基于 Spring 的 CacheManager 和 Caffeine 缓存库:
package com.example.cache;

import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.concurrent.Callable;

/**
* 本地缓存工具类
*/
@Component
public class LocalCacheUtil {

    @Resource
    private CacheManager cacheManager;

    /**
   * 获取缓存值
   *
   * @param cacheName 缓存名称
   * @param key       缓存键
   * @return 缓存值
   */
    public <T> T get(String cacheName, Object key) {
      Cache cache = getCache(cacheName);
      if (cache != null) {
            Cache.ValueWrapper valueWrapper = cache.get(key);
            if (valueWrapper != null) {
                return (T) valueWrapper.get();
            }
      }
      return null;
    }

    /**
   * 获取缓存值,如果不存在则通过 loader 加载
   *
   * @param cacheName 缓存名称
   * @param key       缓存键
   * @param loader    缓存加载器
   * @return 缓存值
   */
    public <T> T get(String cacheName, Object key, Callable<T> loader) {
      Cache cache = getCache(cacheName);
      if (cache != null) {
            return cache.get(key, loader);
      }
      return null;
    }

    /**
   * 添加缓存
   *
   * @param cacheName 缓存名称
   * @param key       缓存键
   * @param value   缓存值
   */
    public void put(String cacheName, Object key, Object value) {
      Cache cache = getCache(cacheName);
      if (cache != null) {
            cache.put(key, value);
      }
    }

    /**
   * 删除缓存
   *
   * @param cacheName 缓存名称
   * @param key       缓存键
   */
    public void evict(String cacheName, Object key) {
      Cache cache = getCache(cacheName);
      if (cache != null) {
            cache.evict(key);
      }
    }

    /**
   * 清空缓存
   *
   * @param cacheName 缓存名称
   */
    public void clear(String cacheName) {
      Cache cache = getCache(cacheName);
      if (cache != null) {
            cache.clear();
      }
    }

    /**
   * 获取缓存对象
   *
   * @param cacheName 缓存名称
   * @return 缓存对象
   */
    private Cache getCache(String cacheName) {
      if (!StringUtils.hasText(cacheName)) {
            throw new IllegalArgumentException("缓存名称不能为空");
      }
      return cacheManager.getCache(cacheName);
    }
}
3. 工具类利用示例

3.1 设置缓存

在 application.yml 中设置 Caffeine 缓存:
spring:
cache:
    type: caffeine
    caffeine:
      spec: maximumSize=1000,expireAfterWrite=10m
3.2 利用工具类

在业务代码中,可以通过注入 LocalCacheUtil 来利用缓存工具类:
@Service
public class BookService {

    @Resource
    private LocalCacheUtil localCacheUtil;

    /**
   * 获取书籍信息
   */
    public Book getBookById(Long id) {
      // 先从缓存中获取
      Book book = localCacheUtil.get("books", id);
      if (book == null) {
            // 如果缓存中不存在,则从数据库加载
            book = loadBookFromDatabase(id);
            // 将结果放入缓存
            localCacheUtil.put("books", id, book);
      }
      return book;
    }

    /**
   * 更新书籍信息
   */
    public void updateBook(Book book) {
      // 更新数据库
      updateBookInDatabase(book);
      // 更新缓存
      localCacheUtil.put("books", book.getId(), book);
    }

    /**
   * 删除书籍信息
   */
    public void deleteBookById(Long id) {
      // 删除数据库记录
      deleteBookFromDatabase(id);
      // 删除缓存
      localCacheUtil.evict("books", id);
    }

    // 模拟从数据库加载书籍信息
    private Book loadBookFromDatabase(Long id) {
      // 这里模拟数据库查询
      return new Book(id, "Spring Boot Guide", "Author Name");
    }

    // 模拟更新数据库
    private void updateBookInDatabase(Book book) {
      // 这里模拟数据库更新
    }

    // 模拟删除数据库记录
    private void deleteBookFromDatabase(Long id) {
      // 这里模拟数据库删除
    }
}
4. 工具类的优势


[*]简化缓存操作:通过工具类封装,业务代码中只需调用简朴的方法即可完成缓存操作。
[*]统一管理缓存:全部缓存操作都通过工具类进行,便于维护和扩展。
[*]支持多种缓存战略:可以通过设置机动调整缓存过期时间、最大容量等参数。
[*]易于扩展:如果需要切换缓存实现(如从 Caffeine 切换到 Ehcache),只需修改设置,无需改动业务代码。
5. 总结

本文计划并实现了一套 Spring Boot 本地缓存工具类,通过封装 Spring 的 CacheManager 和 Caffeine 缓存库,提供了简朴易用的缓存操作 API。该工具类可以显著简化缓存的利用,提升开发服从,同时具备良好的扩展性和机动性。希望本文能帮助你更好地理解和利用 Spring Boot 中的本地缓存功能。
如果你有任何题目或建议,接待在批评区留言讨论!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Spring Boot 本地缓存工具类计划与实现