一、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个组合