原文:https://blog.csdn.net/qq_41921994/article/details/109313445
该文章说明白了
1.caffeine与spring注解 @Cacheable 如何配合使用
2. @Cacheable 中value 与 key的含义
一般使用第三种方式。
第一种方式(只使用Caffeine)
gradle添加依赖
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3'
runtimeOnly 'mysql:mysql-connector-java'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
compile group: 'com.github.ben-manes.caffeine', name: 'caffeine', version: '2.8.4'
// compile('org.springframework.boot:spring-boot-starter-cache')
}
编写配置类
package org.example.base.config;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
/**
* @author l
* @date Created in 2020/10/27 11:05
*/
@Configuration
//@EnableCaching
public class CacheConfig {
@Bean(value = "caffeineCache")
public Cache<String, Object> caffeineCache() {
return Caffeine.newBuilder()
// 设置最后一次写入或访问后经过固定时间过期
.expireAfterWrite(60, TimeUnit.SECONDS)
// 初始的缓存空间大小
.initialCapacity(1000)
// 缓存的最大条数
.maximumSize(10000)
.build();
}
@Bean(value = "caffeineCache2")
public Cache<String, Object> caffeineCache2() {
return Caffeine.newBuilder()
// 设置最后一次写入或访问后经过固定时间过期
.expireAfterWrite(120, TimeUnit.SECONDS)
// 初始的缓存空间大小
.initialCapacity(1000)
// 缓存的最大条数
.maximumSize(10000)
.build();
}
}
测试
package org.example.base;
import com.github.benmanes.caffeine.cache.Cache;
import org.example.base.bean.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class BaseApplicationTests {
@Qualifier("caffeineCache")
@Autowired
Cache<String, Object> cache;
@Qualifier("caffeineCache2")
@Autowired
Cache<String, Object> cache2;
@Test
public void test() {
User user = new User(1, "张三", 18);
cache.put("123", user);
User user1 = (User) cache.getIfPresent("123");
assert user1 != null;
System.out.println(user1.toString());
User user2 = (User) cache2.getIfPresent("1234");
System.out.println(user2 == null);
}
}
输出
第二种方式(使用Caffeine和spring cache)
gradle添加依赖
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3'
runtimeOnly 'mysql:mysql-connector-java'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
compile group: 'com.github.ben-manes.caffeine', name: 'caffeine', version: '2.8.4'
compile('org.springframework.boot:spring-boot-starter-cache')
}
编写配置类
package org.example.base.config;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.Duration;
import java.util.ArrayList;
/**
* @author l
* @date Created in 2020/10/27 11:05
*/
@Configuration
@EnableCaching
public class CacheConfig {
public enum CacheEnum {
/**
* @date 16:34 2020/10/27
* 第一个cache
**/
FIRST_CACHE(300, 20000, 300),
/**
* @date 16:35 2020/10/27
* 第二个cache
**/
SECOND_CACHE(60, 10000, 200);
private int second;
private long maxSize;
private int initSize;
CacheEnum(int second, long maxSize, int initSize) {
this.second = second;
this.maxSize = maxSize;
this.initSize = initSize;
}
}
@Bean("caffeineCacheManager")
public CacheManager cacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
ArrayList<CaffeineCache> caffeineCaches = new ArrayList<>();
for (CacheEnum cacheEnum : CacheEnum.values()) {
caffeineCaches.add(new CaffeineCache(cacheEnum.name(),
Caffeine.newBuilder().expireAfterWrite(Duration.ofSeconds(cacheEnum.second))
.initialCapacity(cacheEnum.initSize)
.maximumSize(cacheEnum.maxSize).build()));
}
cacheManager.setCaches(caffeineCaches);
return cacheManager;
}
// @Bean("FIRST_CACHE")
// public Cache firstCache(CacheManager cacheManager) {
// return cacheManager.getCache("FIRST_CACHE");
// }
//
// @Bean("SECOND_CACHE")
// public Cache secondCache(CacheManager cacheManager) {
// return cacheManager.getCache("SECOND_CACHE");
// }
}
编写service层
package org.example.base.service.impl;
import org.example.base.bean.User;
import org.example.base.service.UserService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @author l
* @date Created in 2020/10/23 14:47
*/
@Service
public class UserServiceImpl implements UserService, CommandLineRunner {
@Resource(name = "caffeineCacheManager")
CacheManager cacheManager;
Cache cache1;
Cache cache2;
// @Qualifier("FIRST_CACHE")
// Cache cache1;
// @Qualifier("SECOND_CACHE")
// Cache cache2;
@Override
public void run(String... args) throws Exception {
cache1 = cacheManager.getCache("FIRST_CACHE");
cache2 = cacheManager.getCache("SECOND_CACHE");
}
@Override
public void setUser(User user) {
cache2.put("123",user);
}
@Override
public User getUser(String id) {
Cache.ValueWrapper valueWrapper = cache2.get(id);
assert valueWrapper != null;
return (User)valueWrapper.get();
}
}
测试
package org.example.base;
import org.example.base.bean.User;
import org.example.base.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class BaseApplicationTests {
@Autowired
private UserService userService;
@Test
public void test() {
User user = new User(123,"jack l",18);
userService.setUser(user);
System.out.println(userService.getUser("123"));
}
}
输出结果
第三种方式(使用Caffeine和spring cache)
gradle依赖添加同方式二
配置类添加方式同方式二
编写service层
package org.example.base.service.impl;
import org.example.base.bean.User;
import org.example.base.service.UserService;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
/**
* @author l
* @date Created in 2020/10/23 14:47
*/
@Service
//@CacheConfig(cacheNames = "SECOND_CACHE",cacheManager = "caffeineCacheManager")
public class UserServiceImpl implements UserService {
/**
* 使用@CachePut注解的方法,一定要有返回值,该注解声明的方法缓存的是方法的返回结果。
* it always causes the
* method to be invoked and its result to be stored in the associated cache
**/
@Override
@CachePut(key = "#user.getId()", value = "SECOND_CACHE", cacheManager = "caffeineCacheManager")
public User setUser(User user) {
System.out.println("已经存储进缓存了");
return user;
}
@Override
@CacheEvict(value = "SECOND_CACHE",cacheManager = "caffeineCacheManager")
public void deleteUser(Integer id) {
System.out.println("缓存删除了");
}
@Override
@Cacheable(key = "#id", value = "SECOND_CACHE", cacheManager = "caffeineCacheManager")
public User getUser(Integer id) {
System.out.println("从数据库取值");
//模拟数据库中的数据
return null;
}
}
测试
package org.example.base;
import org.example.base.bean.User;
import org.example.base.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class BaseApplicationTests {
@Autowired
private UserService userService;
@Test
public void test4(){
User user1 = new User(123, "jack l", 18);
userService.setUser(user1);
System.out.println("从缓存中获取 "+userService.getUser(123));
System.out.println(userService.getUser(123322222));
userService.deleteUser(123);
System.out.println(userService.getUser(123));
}
}
输出结果
————————————————
版权声明:本文为CSDN博主「冬风孤立」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41921994/article/details/109313445