springboot集成本地緩存Caffeine的三種使用方式(小結(jié))
第一種方式(只使用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() // 設(shè)置最后一次寫入或訪問后經(jīng)過固定時間過期 .expireAfterWrite(60, TimeUnit.SECONDS) // 初始的緩存空間大小 .initialCapacity(1000) // 緩存的最大條數(shù) .maximumSize(10000) .build(); } @Bean(value = "caffeineCache2") public Cache<String, Object> caffeineCache2() { return Caffeine.newBuilder() // 設(shè)置最后一次寫入或訪問后經(jīng)過固定時間過期 .expireAfterWrite(120, TimeUnit.SECONDS) // 初始的緩存空間大小 .initialCapacity(1000) // 緩存的最大條數(shù) .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")); } }
輸出結(jié)果
第三種方式(使用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注解的方法,一定要有返回值,該注解聲明的方法緩存的是方法的返回結(jié)果。 * 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("已經(jīng)存儲進緩存了"); 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("從數(shù)據(jù)庫取值"); //模擬數(shù)據(jù)庫中的數(shù)據(jù) 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)); } }
輸出結(jié)果
到此這篇關(guān)于springboot集成本地緩存Caffeine的三種使用方式(小結(jié))的文章就介紹到這了,更多相關(guān)springboot集成本地緩存Caffeine內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合Lucene實現(xiàn)全文檢索的詳細步驟
全文搜索(Full-Text?Search)是指對大規(guī)模存儲在計算機系統(tǒng)中的文本數(shù)據(jù)進行檢索和匹配的技術(shù),它允許用戶輸入關(guān)鍵字,然后從海量的文本數(shù)據(jù)中快速找到相關(guān)的信息,本文介紹了SpringBoot整合Lucene實現(xiàn)全文檢索的詳細步驟,需要的朋友可以參考下2024-03-03PowerJob的DatabaseMonitorAspect源碼流程
這篇文章主要為大家介紹了PowerJob的DatabaseMonitorAspect源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01Java中String的JdbcTemplate連接SQLServer數(shù)據(jù)庫的方法
這篇文章主要介紹了Java中String的JdbcTemplate連接SQLServer數(shù)據(jù)庫的方法,在研發(fā)過程中我們需要與其他系統(tǒng)對接的場景,連接SQLServer拉取數(shù)據(jù),所以就用jdbc連接數(shù)據(jù)庫的方式連接外部數(shù)據(jù)源,需要的朋友可以參考下2021-10-10Java中的字符流FileReader與FileWriter詳解
這篇文章主要介紹了Java中的字符流FileReader與FileWriter詳解,在Java中,使用Unicode約定存儲字符,字符流自動允許我們逐字符讀/寫數(shù)據(jù),有助于執(zhí)行16位Unicode的輸入和輸出,它是以reader和writer結(jié)尾的,需要的朋友可以參考下2023-10-10SpringBoot2學(xué)習之springboot與spring區(qū)別分析
這篇文章主要為大家介紹了SpringBoot2學(xué)習之springboot與spring區(qū)別分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05