您好,登錄后才能下訂單哦!
這篇文章主要講解了“springboot與redis整合中@Cacheable怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“springboot與redis整合中@Cacheable怎么使用”吧!
首先我們需要配置一個緩存管理器,然后才能使用緩存注解來管理緩存
package com.cherish.servicebase.handler; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.time.Duration; @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setConnectionFactory(factory); //key序列化方式 template.setKeySerializer(redisSerializer); //value序列化 template.setValueSerializer(jackson2JsonRedisSerializer); //value hashmap序列化 template.setHashValueSerializer(jackson2JsonRedisSerializer); return template; } @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //解決查詢緩存轉換異常的問題 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 配置序列化(解決亂碼的問題),過期時間600秒 RedisCacheConfiguration config = RedisCacheConfiguration .defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) // 可以給每個cacheName不同的RedisCacheConfiguration 設置不同的過期時間 //.withCacheConfiguration("Users",config.entryTtl(Duration.ofSeconds(100))) .transactionAware() .build(); return cacheManager; } }
標記在方法或者類上,標識該方法或類支持緩存。Spring調用注解標識方法后會將返回值緩存到redis,以保證下次同條件調用該方法時直接從緩存中獲取返回值。這樣就不需要再重新執行該方法的業務處理過程,提高效率。
@Cacheable常用的三個參數如下:
cacheNames 緩存名稱
key 緩存的key,需要注意key的寫法哈
condition 緩存執行的條件,返回true時候執行
示例
//查詢所有用戶,緩存到redis中 @GetMapping("/selectFromRedis") @Cacheable(cacheNames = "Users",key = "'user'") public ResultData getUserRedis(){ List<User> list = userService.list(null); return ResultData.ok().data("User",list); }
第一次查詢是從數據庫查詢的,然后緩存到redis中 使用redis可視化工具查看緩存的信息
第二查詢走了緩存控制臺沒有輸出 ,所以走的redis緩存 就是在redis中獲取結果直接返回。
標記在方法上,方法執行完畢之后根據條件或key刪除對應的緩存。常用的屬性:
allEntries boolean類型,表示是否需要清除緩存中的所有元素
key 需要刪除的緩存的key
//調用這個接口結束后,刪除指定的Redis緩存 @PostMapping("updateUser") @CacheEvict(cacheNames ="Users",key = "'user'") public ResultData updateUser(@RequestBody User user){ String id = user.getId(); QueryWrapper<User> wrapper=new QueryWrapper<>(); wrapper.eq("id",id); boolean b = userService.update(user, wrapper); return ResultData.ok().data("flag",b); }
//不刪除redis緩存 @PostMapping("updateUser2") public ResultData updateUser2(@RequestBody User user){ String id = user.getId(); QueryWrapper<User> wrapper=new QueryWrapper<>(); wrapper.eq("id",id); boolean b = userService.update(user, wrapper); return ResultData.ok().data("flag",b); }
當我們更新數據庫的數據時候,需要把redis的緩存清空。否則我們查詢的數據是redis緩存中的數據,這樣就會導致數據庫和緩存數據不一致的問題。
示例 調用沒有加 @CacheEvict 注解的接口修改數據,在查詢得到的數據是未修改之前的。
所以在我們調用修改數據的接口的時候需要清除緩存
加上 @CacheEvict 注解 清除對應的緩存此時在查詢數據發現數據是最新的,跟數據庫保持一致。
我們已經實現了Spring Cache的基本功能,整合了Redis作為RedisCacheManger
,但眾所周知,我們在使用@Cacheable
注解的時候是無法給緩存這是過期時間的。但有時候在一些場景中我們的確需要給緩存一個過期時間!這是默認的過期時間
數據有效期時間
自定義過期時間
使用新的redis配置,再次查詢緩存到數據看數據有效期
感謝各位的閱讀,以上就是“springboot與redis整合中@Cacheable怎么使用”的內容了,經過本文的學習后,相信大家對springboot與redis整合中@Cacheable怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。