Spring Cache基于Redis緩存

1. Redis

1.1 基于Redis的Spring Cache

1.1.1 使用步驟:

(1). 導(dǎo)入pom依賴:

   < dependency>
       < groupId>org.springframework.boot</groupId>
       < artifactId>spring-boot-starter-cache</artifactId>
   < /dependency>

(2). 創(chuàng)建RedisTemplate 并添加RedisSerializer序列化

       @Bean(name = "redisTemplate1")
        public RedisTemplate<Object, Object> redisTemplate() {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate();
        //設(shè)置序列化Key的實(shí)例化對(duì)象
        redisTemplate.setKeySerializer(new GenericJackson2JsonRedisSerializer());
        //設(shè)置序列化Value的實(shí)例化對(duì)象
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        return redisTemplate;
    }

(3). 創(chuàng)建CacheManager緩存管理器

    @EnableCaching
    @Configuration
    public class CachingConfig extends CachingConfigurerSupport {
        @Bean
        public CacheManager cacheManager(@Qualifier("redisTemplate1") RedisTemplate<Object, Object> redisTemplate) {
            RedisCacheManager manager = new RedisCacheManager(redisTemplate);
            manager.setUsePrefix(true);
            // 整體緩存過(guò)期時(shí)間,即所有緩存的時(shí)間為3600s,會(huì)被緩存自己的緩存時(shí)間覆蓋,如下stu緩存的過(guò)期時(shí)間為1000s
            manager.setDefaultExpiration(3600L);
            // 設(shè)置緩存過(guò)期時(shí)間。key和緩存過(guò)期時(shí)間,單位秒,在@Cacheable注解中使用的value指的是要使用的緩存的名字
            Map<String, Long> expiresMap = new HashMap<>();
            expiresMap.put("stu", 1000L);//設(shè)置stu緩存的過(guò)期時(shí)間為1000s
            manager.setExpires(expiresMap);
            return manager;
        }
    }

***(4). 在緩存對(duì)象的方法前添加注解 ***
1.1 @Cacheable:在方法執(zhí)行前Spring先查看緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),則直接返回緩存數(shù)據(jù),若沒(méi)有數(shù)據(jù),調(diào)用方法并將方法返回值放進(jìn)緩存;
1.2 @CachePut:無(wú)論怎樣都會(huì)將方法的返回值放進(jìn)緩存中;@Cacheable與@CachePut的屬性保持一致;
1.3 @CacheEvict:將一條或多條數(shù)據(jù)從緩存中刪除;
代碼示例:(注:如果沒(méi)有指定key則將方法參數(shù)作為key保存到緩存中)

    public interface StudentService {
        //@CachePut緩存新增或更新的數(shù)據(jù)到緩存,其中緩存的名字叫“stucache”,數(shù)據(jù)的key是newStudnet的id
     @CachePut(value = "stucache", key = "#newStudnet.id")
     Student save(Student newStudnet);
         //@CacheEvict從緩存“stucache”中刪除id為deid的數(shù)據(jù)
    @CacheEvict(value = "stucache")
    boolean delete(long deid);
    //緩存key為id的數(shù)據(jù)到緩存“stucache”中;
    @Cacheable(value = "stucache", key = "#p0")
    Student queryOneStudentById(long id);
    @CachePut(value = "stucache", key = "#updaStudent.id")
    Student updateStudent(Student updaStudent);
    }

(5). 在啟動(dòng)類前面添加@EnableCaching注解開啟緩存

1.1.2 遇到過(guò)的問(wèn)題

(1). 存儲(chǔ)對(duì)象序列化問(wèn)題
問(wèn)題描述
①所有字符都是以16進(jìn)制顯示的問(wèn)題
②中文字符以16進(jìn)制顯示的問(wèn)題
解決辦法:
①通過(guò)redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()),和redisTemplate.setKeySerializer(new GenericJackson2JsonRedisSerializer());設(shè)置key-value序列化
②只需要在終端開啟redis客戶端的時(shí)候添加--raw(兩個(gè)中杠)可將中文正確顯示;這是客戶端的原因和服務(wù)沒(méi)關(guān)系;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,537評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,262評(píng)論 6 342
  • 緩存是最直接有效提升系統(tǒng)性能的手段之一。個(gè)人認(rèn)為用好用對(duì)緩存是優(yōu)秀程序員的必備基本素質(zhì)。 本文結(jié)合實(shí)際開發(fā)經(jīng)驗(yàn),從...
    Java小生閱讀 968評(píng)論 1 3
  • 白芷/文 自古以來(lái),家風(fēng)家訓(xùn)不僅影響著家族聲望,對(duì)子孫后代的人品的塑造也是不可忽視的。家風(fēng)就是家規(guī),是一家子的風(fēng)氣...
    白芷茶舍閱讀 1,242評(píng)論 0 14
  • 日精進(jìn)打卡第60天】 【知~學(xué)習(xí)】 《六項(xiàng)精進(jìn)》1遍共120遍 《大學(xué)》1遍共99遍 ?????? 【經(jīng)典名句分享...
    偉_08cf閱讀 160評(píng)論 0 0

友情鏈接更多精彩內(nèi)容