springboot集成本地缓存Caffeine
冬风孤立 人气:0第一种方式(只使用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; 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")); } }
测试
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)); } }
输出结果
加载全部内容