springboot集成使用caffeine本地缓存

it2023-12-26  64

一、springboot集成caffeine方法一

1、引入依赖

<!-- 引入caffeine --> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>2.6.2</version> </dependency>

2、配置缓存配置类

/** * @ClassName CacheConfig * @Description 缓存配置类 * @Author ninghq * @Date 2020/10/19 16:30 * @Version 1.0.0 **/ @Configuration public class CacheConfig { @Bean public Cache<String, Object> caffeineCache() { return Caffeine.newBuilder() // 设置最后一次写入或访问后经过固定时间过期 .expireAfterWrite(60, TimeUnit.SECONDS) // 初始的缓存空间大小 .initialCapacity(100) // 缓存的最大条数 .maximumSize(1000) //缓存写入/删除 监控 .writer(new CacheWriter<Object, Object>() { @Override public void write(Object key, Object value) { //此方法是同步阻塞的 System.out.println("--缓存写入--:key=" + key + ", value=" + value); } @Override public void delete(Object key, Object value, RemovalCause cause) { System.out.println("--缓存删除--:key=" + key); } }) .build(); } }

3、创建相关测试类

创建UserInfo实体类 public class UserInfo { private Integer id; private String name; private String sex; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

 

 

创建service测试类

@Service public class CacheService { private Logger log = LoggerFactory.getLogger(CacheService.class); @Autowired private CacheDao cacheDao; @Autowired Cache<String, Object> caffeineCache; /** * 获取用户信息 * @param id 用户ID * @return 用户信息 */ public UserInfo getByName(Integer id) { // 先从缓存读取 caffeineCache.getIfPresent(id); UserInfo userInfo = (UserInfo) caffeineCache.asMap().get(String.valueOf(id)); if (userInfo != null){ return userInfo; } // 如果缓存中不存在,则从库中查找 log.info("get"); UserInfo userInfo = cacheDao.get(id); // 如果用户信息不为空,则加入缓存 if (userInfo != null){ caffeineCache.put(String.valueOf(userInfo.getId()), userInfo); } return userInfo; } /** * 修改用户信息 * @param userInfo 用户信息 * @return 用户信息 */ public UserInfo updateUserInfo(UserInfo userInfo) { log.info("update"); // 取旧的值 UserInfo oldUserInfo = cacheDao.get(userInfo.getId()); if (oldUserInfo == null) { return null; } // 替换内容 if (!StringUtils.isEmpty(oldUserInfo.getAge())) { oldUserInfo.setAge(userInfo.getAge()); } if (!StringUtils.isEmpty(oldUserInfo.getName())) { oldUserInfo.setName(userInfo.getName()); } if (!StringUtils.isEmpty(oldUserInfo.getSex())) { oldUserInfo.setSex(userInfo.getSex()); } // 将新的对象存储,更新旧对象信息 cacheDao.put(userInfo); // 替换缓存中的值 caffeineCache.put(String.valueOf(oldUserInfo.getId()),oldUserInfo); return oldUserInfo; } /** * 删除用户信息 * @param id 用户ID */ public void deleteById(Integer id) { log.info("delete"); cacheDao.remove(id); // 从缓存中删除 caffeineCache.asMap().remove(String.valueOf(id)); } }

 

创建Dao测试类

public interface CacheDao { @Select("select * from `user_info` WHERE `id` = #{id};") UserInfo get(int id); @Update(" UPDATE `user_info` SET `name` = #{name}, `sex` = #{sex}, `age` = #{age} WHERE `id` = #{id}; ") int put(UserInfo userInfo); @Delete(" delete from `user_info` WHERE `id` = #{id}; ") void remove(Integer id); }

 

创建Controller测试类

@RestController @RequestMapping("/v1/cache") public class CacheController { @Autowired private CacheService cacheService; @GetMapping("/userInfo/{id}") public Object getUserInfo(@PathVariable Integer id) { UserInfo userInfo = cacheService.getByName(id); if (userInfo == null) { return "没有该用户"; } return userInfo; } @PutMapping("/userInfo") public Object updateUserInfo(@RequestBody UserInfo userInfo) { UserInfo newUserInfo = cacheService.updateUserInfo(userInfo); if (newUserInfo == null){ return "不存在该用户"; } return newUserInfo; } @DeleteMapping("/userInfo/{id}") public Object deleteUserInfo(@PathVariable Integer id) { cacheService.deleteById(id); return "SUCCESS"; } }

 

二、springboot集成caffeine方法二

1、引入依赖

<!-- 引入caffeine --> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>2.6.2</version> </dependency> <!-- springboot缓存 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>

 

2、配置缓存配置类

@Configuration public class CacheConfig { /** * 配置缓存管理器 * * @return 缓存管理器 */ @Bean("caffeineCacheManager") public CacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager(); cacheManager.setCaffeine(Caffeine.newBuilder() // 设置最后一次写入或访问后经过固定时间过期 .expireAfterAccess(60, TimeUnit.SECONDS) //缓存写入/删除 监控 .writer(new CacheWriter<Object, Object>() { @Override public void write(Object key, Object value) { //此方法是同步阻塞的 System.out.println("--缓存写入--:key=" + key + ", value=" + value); } @Override public void delete(Object key, Object value, RemovalCause cause) { System.out.println("--缓存删除--:key=" + key); } }) // 初始的缓存空间大小 .initialCapacity(100) // 缓存的最大条数 .maximumSize(1000)); return cacheManager; } }

 

3、启动类配置缓存注解

新增注解@EnableCaching

@SpringBootApplication @MapperScan("com.example.demo.dao") @EnableCaching public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }

4、创建相关测试类

创建UserInfo实体类

public class UserInfo { private Integer id; private String name; private String sex; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

 

创建service类

@Service @CacheConfig(cacheNames = "caffeineCacheManager") public class CacheService { private Logger log = LoggerFactory.getLogger(CacheService.class); @Autowired private CacheDao cacheDao; /** * 获取用户信息 * @param id 用户ID * @return 用户信息 */ @Cacheable(key = "#id") public UserInfo getByName(Integer id) { log.info("get"); UserInfo userInfo = cacheDao.get(id); return userInfo; } /** * 修改用户信息 * @param userInfo 用户信息 * @return 用户信息 */ @CachePut(key = "#userInfo.id") public UserInfo updateUserInfo(UserInfo userInfo) { log.info("update"); // 取旧的值 UserInfo oldUserInfo = cacheDao.get(userInfo.getId()); if (oldUserInfo == null) { return null; } // 替换内容 if (!StringUtils.isEmpty(oldUserInfo.getAge())) { oldUserInfo.setAge(userInfo.getAge()); } if (!StringUtils.isEmpty(oldUserInfo.getName())) { oldUserInfo.setName(userInfo.getName()); } if (!StringUtils.isEmpty(oldUserInfo.getSex())) { oldUserInfo.setSex(userInfo.getSex()); } cacheDao.put(userInfo); return oldUserInfo; } /** * 删除用户信息 * @param id 用户ID */ @CacheEvict(key = "#id") public void deleteById(Integer id) { log.info("delete"); cacheDao.remove(id); } }

 

创建Dao类

public interface CacheDao { @Select("select * from `user_info` WHERE `id` = #{id};") UserInfo get(int id); @Update(" UPDATE `user_info` SET `name` = #{name}, `sex` = #{sex}, `age` = #{age} WHERE `id` = #{id}; ") int put(UserInfo userInfo); @Delete(" delete from `user_info` WHERE `id` = #{id}; ") void remove(Integer id); }

创建Controller测试类

@RestController @RequestMapping("/v1/cache") public class CacheController { @Autowired private CacheService cacheService; @GetMapping("/userInfo/{id}") public Object getUserInfo(@PathVariable Integer id) { UserInfo userInfo = cacheService.getByName(id); if (userInfo == null) { return "没有该用户"; } return userInfo; } @PutMapping("/userInfo") public Object updateUserInfo(@RequestBody UserInfo userInfo) { UserInfo newUserInfo = cacheService.updateUserInfo(userInfo); if (newUserInfo == null){ return "不存在该用户"; } return newUserInfo; } @DeleteMapping("/userInfo/{id}") public Object deleteUserInfo(@PathVariable Integer id) { cacheService.deleteById(id); return "SUCCESS"; } }

4.1关于spring缓存标签的说明

@Cacheable,首先在缓存中查询,没有的话,进方法执行,执行完成后返回值放缓存;@CachePut,不进行查询判断,直接新增或者更新缓存内容,类似add或update;@CacheEvict,直接清除,类似delete。@Caching,1,2,3个组合
最新回复(0)