一、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 {@Beanpublic Cache<String, Object> caffeineCache() {return Caffeine.newBuilder()// 设置最后一次写入或访问后经过固定时间过期.expireAfterWrite(60, TimeUnit.SECONDS)// 初始的缓存空间大小.initialCapacity(100)// 缓存的最大条数.maximumSize(1000)//缓存写入/删除 监控.writer(new CacheWriter<Object, Object>() {@Overridepublic void write(Object key, Object value) { //此方法是同步阻塞的System.out.println("--缓存写入--:key=" + key + ", value=" + value);}@Overridepublic 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);@Autowiredprivate CacheDao cacheDao;@AutowiredCache<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 {@Autowiredprivate 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>() {@Overridepublic void write(Object key, Object value) { //此方法是同步阻塞的System.out.println("--缓存写入--:key=" + key + ", value=" + value);}@Overridepublic 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);@Autowiredprivate 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 {@Autowiredprivate 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个组合