Spring @Cacheable自定義緩存過期時(shí)間的實(shí)現(xiàn)示例
實(shí)現(xiàn)效果
原來的@Cacheable使用方式:
@Cacheable(value = "userinfo", key = "#dto.userId")
實(shí)現(xiàn)后的使用方式:
@Cacheable(value = "userinfo#30#m", key = "#dto.userId")
實(shí)現(xiàn)代碼
創(chuàng)建一個(gè)自定義的緩存管理器,繼承自RedisCacheManager
public class CustomRedisCacheManager extends RedisCacheManager {
public CustomRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
super(cacheWriter, defaultCacheConfiguration);
}
/**
* 重寫createRedisCache方法
* @param name 原來的name只是作為redis存儲(chǔ)鍵名
* 重寫的name可通過"#"拼接過期時(shí)間:
* 1. 如果沒有"#"則默認(rèn)不設(shè)置過期時(shí)間
* 2. 拼接的第一個(gè)"#"后面為過期時(shí)間,第二個(gè)"#"后面為時(shí)間單位
* 3. 時(shí)間單位的表示使用: d(天)、h(小時(shí))、m(分鐘)、s(秒), 默認(rèn)為h(小時(shí))
* @param cacheConfig
* @return
*/
@Override
protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
// 解析name,設(shè)置過期時(shí)間
if (StringUtils.isNotEmpty(name) && name.contains("#")) {
String[] split = name.split("#");
// 緩存鍵名
String cacheName = split[0];
// "#"后第一位是時(shí)間
int expire = Integer.parseInt(split[1]);
// 過期時(shí)間,默認(rèn)為h(小時(shí))
Duration duration = Duration.ofHours(expire);
// 根據(jù)"#"后第二位字符判斷過期時(shí)間的單位,設(shè)置相應(yīng)的過期時(shí)間,默認(rèn)時(shí)間單位是h(小時(shí))
if (split.length == 3) {
switch (split[2]){
case "d":
duration = Duration.ofDays(expire);
break;
case "m":
duration = Duration.ofMinutes(expire);
break;
case "s":
duration = Duration.ofSeconds(expire);
break;
default:
duration = Duration.ofHours(expire);
}
}
return super.createRedisCache(cacheName, cacheConfig.entryTtl(duration));
}
return super.createRedisCache(name, cacheConfig);
}
}
在redis配置類中,將上面自定義的緩存管理器注冊(cè)為Bean
@Configuration
@EnableCaching
public class RedisConfig {
/**
* 自定義RedisTemplate
* 設(shè)置Redis序列化方式,默認(rèn)使用的是JDKSerializer的序列化方式,效率低,所以這里設(shè)置使用FastJsonRedisSerializer
* @param connectionFactory
* @return
*/
@Bean
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 設(shè)置redis連接(LettuceConnectionFactory實(shí)現(xiàn)了RedisConnectionFactory)
redisTemplate.setConnectionFactory(connectionFactory);
FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class);
// key設(shè)置StringRedisSerializer序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// value設(shè)置FastJsonRedisSerializer序列化
redisTemplate.setValueSerializer(serializer);
// Hash key設(shè)置序列化
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// Hash value設(shè)置序列化
redisTemplate.setHashValueSerializer(serializer);
return redisTemplate;
}
/**
* 實(shí)例化自定義的緩存管理器
* @param redisTemplate
* @return
*/
@Bean
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisTemplate.getConnectionFactory()));
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
return new CustomRedisCacheManager(redisCacheWriter, redisCacheConfiguration);
}
}到此這篇關(guān)于Spring @Cacheable自定義緩存過期時(shí)間的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Spring @Cacheable緩存過期時(shí)間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 實(shí)現(xiàn)增量同步和自定義同步的操作
這篇文章主要介紹了java 實(shí)現(xiàn)增量同步和自定義同步的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Java中json與javaBean幾種互轉(zhuǎn)的講解
今天小編就為大家分享一篇關(guān)于Java中json與javaBean幾種互轉(zhuǎn)的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
SpringBoot整合Echarts繪制靜態(tài)數(shù)據(jù)柱狀圖和餅圖
這篇文章給大家介紹了SpringBoot整合Echarts繪制靜態(tài)數(shù)據(jù)柱狀圖和餅圖,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-03-03
解決Java壓縮zip異常java.util.zip.ZipException:duplicate entry
這篇文章主要介紹了解決Java壓縮zip異常java.util.zip.ZipException:duplicate entry:問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
關(guān)于@Qualifier("beanName")用法
@Qualifier用于精確指定Bean,@Primary設(shè)為默認(rèn),兩者共存時(shí),@Qualifier優(yōu)先級(jí)更高,可靈活選擇具體實(shí)現(xiàn),解決依賴注入歧義,兼顧簡潔與可配置性2025-09-09
java構(gòu)造器 默認(rèn)構(gòu)造方法及參數(shù)化構(gòu)造方法
構(gòu)造器也叫構(gòu)造方法、構(gòu)造函數(shù),是一種特殊類型的方法,負(fù)責(zé)類中成員變量(域)的初始化。構(gòu)造器的用處是在創(chuàng)建對(duì)象時(shí)執(zhí)行初始化,當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),系統(tǒng)會(huì)為這個(gè)對(duì)象的實(shí)例進(jìn)行默認(rèn)的初始化,下面文章將進(jìn)入講解,需要的朋友可以參考下2021-10-10

