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

打印 上一主题 下一主题

主题 1010|帖子 1010|积分 3030

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

1. 工具类计划目标

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

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

2. 工具类实现

2.1 添加依赖

首先,在 pom.xml 中添加 Spring Boot 缓存支持的依赖:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-cache</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>com.github.ben-manes.caffeine</groupId>
  7.     <artifactId>caffeine</artifactId>
  8. </dependency>
复制代码
2.2 启用缓存

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

以下是一个通用的本地缓存工具类实现,基于 Spring 的 CacheManager 和 Caffeine 缓存库:
  1. package com.example.cache;
  2. import org.springframework.cache.Cache;
  3. import org.springframework.cache.CacheManager;
  4. import org.springframework.stereotype.Component;
  5. import org.springframework.util.StringUtils;
  6. import javax.annotation.Resource;
  7. import java.util.concurrent.Callable;
  8. /**
  9. * 本地缓存工具类
  10. */
  11. @Component
  12. public class LocalCacheUtil {
  13.     @Resource
  14.     private CacheManager cacheManager;
  15.     /**
  16.      * 获取缓存值
  17.      *
  18.      * @param cacheName 缓存名称
  19.      * @param key       缓存键
  20.      * @return 缓存值
  21.      */
  22.     public <T> T get(String cacheName, Object key) {
  23.         Cache cache = getCache(cacheName);
  24.         if (cache != null) {
  25.             Cache.ValueWrapper valueWrapper = cache.get(key);
  26.             if (valueWrapper != null) {
  27.                 return (T) valueWrapper.get();
  28.             }
  29.         }
  30.         return null;
  31.     }
  32.     /**
  33.      * 获取缓存值,如果不存在则通过 loader 加载
  34.      *
  35.      * @param cacheName 缓存名称
  36.      * @param key       缓存键
  37.      * @param loader    缓存加载器
  38.      * @return 缓存值
  39.      */
  40.     public <T> T get(String cacheName, Object key, Callable<T> loader) {
  41.         Cache cache = getCache(cacheName);
  42.         if (cache != null) {
  43.             return cache.get(key, loader);
  44.         }
  45.         return null;
  46.     }
  47.     /**
  48.      * 添加缓存
  49.      *
  50.      * @param cacheName 缓存名称
  51.      * @param key       缓存键
  52.      * @param value     缓存值
  53.      */
  54.     public void put(String cacheName, Object key, Object value) {
  55.         Cache cache = getCache(cacheName);
  56.         if (cache != null) {
  57.             cache.put(key, value);
  58.         }
  59.     }
  60.     /**
  61.      * 删除缓存
  62.      *
  63.      * @param cacheName 缓存名称
  64.      * @param key       缓存键
  65.      */
  66.     public void evict(String cacheName, Object key) {
  67.         Cache cache = getCache(cacheName);
  68.         if (cache != null) {
  69.             cache.evict(key);
  70.         }
  71.     }
  72.     /**
  73.      * 清空缓存
  74.      *
  75.      * @param cacheName 缓存名称
  76.      */
  77.     public void clear(String cacheName) {
  78.         Cache cache = getCache(cacheName);
  79.         if (cache != null) {
  80.             cache.clear();
  81.         }
  82.     }
  83.     /**
  84.      * 获取缓存对象
  85.      *
  86.      * @param cacheName 缓存名称
  87.      * @return 缓存对象
  88.      */
  89.     private Cache getCache(String cacheName) {
  90.         if (!StringUtils.hasText(cacheName)) {
  91.             throw new IllegalArgumentException("缓存名称不能为空");
  92.         }
  93.         return cacheManager.getCache(cacheName);
  94.     }
  95. }
复制代码

3. 工具类利用示例

3.1 设置缓存

在 application.yml 中设置 Caffeine 缓存:
  1. spring:
  2.   cache:
  3.     type: caffeine
  4.     caffeine:
  5.       spec: maximumSize=1000,expireAfterWrite=10m
复制代码
3.2 利用工具类

在业务代码中,可以通过注入 LocalCacheUtil 来利用缓存工具类:
  1. @Service
  2. public class BookService {
  3.     @Resource
  4.     private LocalCacheUtil localCacheUtil;
  5.     /**
  6.      * 获取书籍信息
  7.      */
  8.     public Book getBookById(Long id) {
  9.         // 先从缓存中获取
  10.         Book book = localCacheUtil.get("books", id);
  11.         if (book == null) {
  12.             // 如果缓存中不存在,则从数据库加载
  13.             book = loadBookFromDatabase(id);
  14.             // 将结果放入缓存
  15.             localCacheUtil.put("books", id, book);
  16.         }
  17.         return book;
  18.     }
  19.     /**
  20.      * 更新书籍信息
  21.      */
  22.     public void updateBook(Book book) {
  23.         // 更新数据库
  24.         updateBookInDatabase(book);
  25.         // 更新缓存
  26.         localCacheUtil.put("books", book.getId(), book);
  27.     }
  28.     /**
  29.      * 删除书籍信息
  30.      */
  31.     public void deleteBookById(Long id) {
  32.         // 删除数据库记录
  33.         deleteBookFromDatabase(id);
  34.         // 删除缓存
  35.         localCacheUtil.evict("books", id);
  36.     }
  37.     // 模拟从数据库加载书籍信息
  38.     private Book loadBookFromDatabase(Long id) {
  39.         // 这里模拟数据库查询
  40.         return new Book(id, "Spring Boot Guide", "Author Name");
  41.     }
  42.     // 模拟更新数据库
  43.     private void updateBookInDatabase(Book book) {
  44.         // 这里模拟数据库更新
  45.     }
  46.     // 模拟删除数据库记录
  47.     private void deleteBookFromDatabase(Long id) {
  48.         // 这里模拟数据库删除
  49.     }
  50. }
复制代码

4. 工具类的优势


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

5. 总结

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表