springboot集成本地緩存Caffeine的三種使用方式(小結)
更新時間:2022年06月02日 16:04:00 作者:冬風孤立
本文主要介紹了springboot集成本地緩存Caffeine的三種使用方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
第一種方式(只使用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));
}
}
輸出結果

到此這篇關于springboot集成本地緩存Caffeine的三種使用方式(小結)的文章就介紹到這了,更多相關springboot集成本地緩存Caffeine內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Servlet連接數據庫實現(xiàn)用戶登錄的實現(xiàn)示例
本文主要介紹了Servlet連接數據庫實現(xiàn)用戶登錄的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06
spring boot國際化之MessageSource的使用方法
這篇文章主要給大家介紹了spring boot國際化之MessageSource使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
SpringMVC4.3?HandlerExceptionResolver異常處理源碼解析
這篇文章主要為大家介紹了SpringMVC4.3?HandlerExceptionResolver異常處理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2023-09-09
JAVA面試題 從源碼角度分析StringBuffer和StringBuilder的區(qū)別
這篇文章主要介紹了JAVA面試題 從源碼角度分析StringBuffer和StringBuilder的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面我們來一起學習下吧2019-07-07

