springboot @cacheable不起作用_Springboot学习记录13 使用缓存:整合redis
本學習記錄的代碼,部分參考自gitee碼云的如下工程。這個工程有詳盡的Spingboot1.x教程。鳴謝!
https://gitee.com/didispace/SpringBoot-Learning.git
本學習記錄的示例代碼克隆地址,分支為develop
https://gitee.com/kutilion/MyArtifactForEffectiveJava.git
初次接觸redis緩存技術是應用在一個企業級web項目上。因為是跨國企業,必須對應多語言的情況。涉及到畫面上顯示文字,比如控件的標簽(label)等。解決方案是將所有相關語言的字符串都存在DB中,根據locale來取得相應語言的字符串。
這產生了一個性能問題:如果每次畫面刷新都要去DB中取數據,會對DB的負載產生不利影響,所以想到使用緩存來解決這個問題。畫面第一次刷新時從DB取得想要表示的語言,然后存放在緩存中。下一次畫面刷新就可以直接從緩存取得,減輕了DB負擔。
這是一個緩存實際應用的實例。下面來學習一下redis緩存。
安裝redis
實際項目一般會獨立建立一個緩存服務器,當然現在一般建立在云上。為了測試,可以在本地的PC上安裝redis。
下載路徑
https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100
下載redis-win-3.2.100.zip,并且解壓到C盤的redis目錄。命令行切換至C:edis, 之后可以參考下圖輸入命令redis-server.exe redis.windows.conf
成功需要重新啟動一個命令行界面,再按照下圖測試一下是否能夠正確緩存數據
以上安裝步驟參考自連接:
https://www.runoob.com/redis/redis-install.html
為工程引入redis
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-data-redis:2.1.3.RELEASE'spring-boot-starter-data-redis的最新版本是2.1.5.RELEASE,不影響示例,所以使用稍舊的2.1.3.RELEASE版本。
BootApplication.java
@EnableCachingpublic class BootApplication {一定要在啟動類中加入@EnableCaching,否則緩存不起作用
另外,需要加入緩存的類必須實現序列化接口,否則會拋出異常。示例中序列化的類為TestOjbect類。
配置redis
大部分的redis配置springboot都代勞了,我們只需要配置一些必要的屬性即可。具體可以參照注釋。其實如果使用注解方式(如@Cacheable等)來使用緩存,示例中的配置都可以省略。
application.properties
# spring.cache.type=simplespring.redis.database=0 # Redis服務器地址,示例為本地所以是127.0.0.1spring.redis.host=127.0.0.1# 端口號spring.redis.port=6379# 密碼,默認為沒有密碼。如果利用redis-cli設定了密碼,這里必須定義spring.redis.password=# 連接池最大連接數(使用負值表示沒有限制) spring.redis.pool.max-active=8# 連接池最大阻塞等待時間(使用負值表示沒有限制) spring.redis.pool.max-wait=-1# 連接池中的最大空閑連接 spring.redis.pool.max-idle=8# 連接池中的最小空閑連接 spring.redis.pool.min-idle=0# 連接超時時間(毫秒) spring.redis.timeout=1000最上方的spring.cache.type=simple,如果打開注釋,則表示強制使用Java的ConcurrentHashMap來作為緩存。redis將不起作用。一般在開發階段會使用這個屬性。
使用redis
現在已經啟動了redis服務,在springboot里的配置也已經做好了。可以開始使用redis。下面學習兩種使用redis的方式:通過注解使用緩存和通過RedisTemplate使用緩存。
通過注解使用緩存
- studySpringboot.n13.redis.mapper.RedisMapper.java
//...@CacheConfig(cacheNames = "testObjects")@Mapperpublic interface RedisMapper { @Cacheable(key = "#p0") @Select("SELECT * FROM TESTOBJECT WHERE ID = #{id}") TestObject findById(@Param("id") String id);//...這個類利用mybatis的功能,findById方法從DB中取得數據。使用@Cacheable注解將取得的數據放入緩存。注意類上方的注解CacheConfig指定了緩存名,它會作為緩存key的前半部分出現。Cacheable的屬性key就是緩存key的后半部分,這里指定的#p0表明是方法的第一個參數。它也支持直接使用參數名,前提是參數名不是某些特殊保留字。比如示例方法用的id就不能使用,否則會出現異常。下面是一個key的小例子:
testOjbects::20這個類只使用了Cacheable注解,從DB里第一次去除的數據被存入緩存,如果DB的數據變化了,是不會反映到緩存中的。通過下面的測試可以證實這一點:
- studySpringboot.n13.redis.mapper.RedisTest.java
@Before public void clear() throws Exception { redisMapper.delete("20"); } @Test public void test() throws Exception { redisMapper.insert("20
總結
以上是生活随笔為你收集整理的springboot @cacheable不起作用_Springboot学习记录13 使用缓存:整合redis的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql和jdbc的区别_JDBC详解
- 下一篇: mysql 表a不存在表b_[mysql