SpringBoot 整合 Redis禁舷,一篇解決“緩存”的所有問題!

前言

這篇博文我們介紹SpringBoot如何整合Redis來訪問非關(guān)系型數(shù)據(jù)庫毅往,帶你深入了解Redis的自動原理牵咙,并結(jié)合具體案例進(jìn)行實(shí)操,分享所有的源碼攀唯。

01 為什么選擇Spring Data Redis洁桌?

Spring Data Redis是Spring Data家族中最重要的一分子,它提供了從Spring應(yīng)用程序輕松配置并訪問Redis的功能革答。它提供了用于與存儲交互的低級和高級抽象战坤,使用戶擺脫了對基礎(chǔ)設(shè)施的擔(dān)憂。

Spring Framework 是領(lǐng)先的全棧 Java/JEE 應(yīng)用程序框架残拐。它通過使用依賴注入、AOP 和可移植服務(wù)抽象提供了一個輕量級容器和一個非侵入式編程模型碟嘴。

Spring Data Redis (SDR) 框架通過 Spring 出色的基礎(chǔ)架構(gòu)支持消除了與存儲交互所需的冗余任務(wù)和樣板代碼溪食,從而可以輕松編寫使用 Redis 鍵值存儲的 Spring 應(yīng)用程序。

image.png

02 Spring Boot整合Redis

2.1 導(dǎo)入依賴項

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

自動引入的依賴娜扇,如圖所示:

image.png

2.2 自動配置原理

自動配置類RedisAutoConfiguration

image.png
  • RedisProperties屬性類错沃,用于對Redis的基本屬性配置
  • LettuceConnectionConfiguration、JedisConnectionConfiguration雀瓢,Redis的客戶端類型枢析,其中配置了連接工廠,連接池等刃麸,默認(rèn)為Lettuce醒叁,底層引入了Lettuce客戶端jar包
  • 自動注入了RedisTemplate**<Object, **Object> : xxxTemplate;自動注入了StringRedisTemplate;k:v都是String

底層只要我們使用StringRedisTemplate把沼、RedisTemplate就可以操作redis

2.3 默認(rèn)整合Lettuce

2.3.1 添加配置

server:
  port: 8083

spring:
  application:
    name: springboot-redis
  redis:
    # Redis服務(wù)器地址
    host: localhost
    # Redis服務(wù)器連接端口
    port: 6379
    # Redis服務(wù)器連接密碼(默認(rèn)為空)
    password:
    # Redis數(shù)據(jù)庫索引(默認(rèn)為0)
    database: 0
  # 連接超時時間(毫秒)
    timeout : 300
    client-type: lettuce #切換jedis客戶端啊易,改成jedis
    lettuce: #切換jedis客戶端,改成jedis
      pool:
        # 連接池最大連接數(shù)(使用負(fù)值表示沒有限制)
        max-active: 8
        # 連接池最大阻塞等待時間(使用負(fù)值表示沒有限制)
        max-wait: -1
        # 連接池中的最大空閑連接
        max-idle: 8
        # 連接池中的最小空閑連接
        min-idle: 0

2.4 切換至Jedis

2.4.1 導(dǎo)入jar

<!--導(dǎo)入jedis-->        
<dependency>            
    <groupId>redis.clients</groupId>            
    <artifactId>jedis</artifactId>        
</dependency>

注意:配置基本同上饮睬,只需要將lettuce換成jedis即可租谈。

2.5 配置序列化方式

RedisTemplate默認(rèn)的序列化方式為JdkSerializationRedisSerializer,會把對象序列化存儲到Redis中(二進(jìn)制形式)捆愁,StringRedisTemplate的默認(rèn)序列化方式為StringRedisSerializer割去。絕大多數(shù)情況下,不推薦使用 JdkSerializationRedisSerializer 進(jìn)行序列化昼丑,主要是不方便人工排查數(shù)據(jù)呻逆。所以我們需要切換序列化方式。

Spring Data底層為我們實(shí)現(xiàn)了七種不同的序列化方式矾克,大家可以根據(jù)需要進(jìn)行選擇页慷,如下圖所示:

image.png

我們以Jackson2JsonRedisSerializer為例,展示如何切換序列化方式胁附。

@Configuration
public class RedisConfig {

    /**
     * 默認(rèn)是JDK的序列化策略酒繁,這里配置redisTemplate采用的是Jackson2JsonRedisSerializer的序列化策略
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        //使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(默認(rèn)使用JDK的序列化方式)
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 配置連接工廠
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //使用StringRedisSerializer來序列化和反序列化redis的key值
        //redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setKeySerializer(jackson2JsonRedisSerializer);
        // 值采用json序列化
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    /***
     * stringRedisTemplate默認(rèn)采用的是String的序列化策略
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory){
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
        return stringRedisTemplate;
    }

}

03 代碼示例

我為廣大粉絲朋友提供了詳細(xì)使用案例,以便更好地學(xué)習(xí)Redis控妻。只展示其中一部分的代碼州袒,更加詳細(xì)的代碼,大家可以通過源碼地址來查看弓候。

@SpringBootTest
public class RedisApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void testRedis(){
        ValueOperations<String, String> operations = redisTemplate.opsForValue();

        operations.set("hello","world");

        String hello = operations.get("hello");
        System.out.println(hello);
    }

    /**
     * 操作字符串
     */
    @Test
    public void testString() {
        //設(shè)置值
        stringRedisTemplate.opsForValue().set("String", "Mao");
        //獲取值
        String string = stringRedisTemplate.opsForValue().get("String");
        System.out.println(string);

        //設(shè)置值且設(shè)置超時時間
        stringRedisTemplate.opsForValue().set("Middle", "Yu", 3, TimeUnit.MINUTES);
        String middle = stringRedisTemplate.opsForValue().get("Middle");
        System.out.println(middle);

        //刪除數(shù)據(jù)
        Boolean isDelete = stringRedisTemplate.delete("String");
        Assert.isTrue(isDelete, "刪除失敗");
    }

    /**
     * 操作列表
     */
    @Test
    public void testList() {
        ListOperations listOp = redisTemplate.opsForList();
        //往 List 左側(cè)插入一個元素
        listOp.leftPush("nameList", "mike");
        listOp.leftPush("nameList", "kim");
        //往 List 右側(cè)插入一個元素
        listOp.rightPush("nameList", "jimmy");
        listOp.rightPush("nameList", "chuck");
        //List 大小
        Long size = listOp.size("nameList");
        //遍歷整個List
        List nameList1 = listOp.range("nameList", 0, size);
        System.out.println(JSON.toJSONString(nameList1));
        //遍歷整個List郎哭,-1表示倒數(shù)第一個即最后一個
        List nameList = listOp.range("nameList", 0, -1);
        System.out.println(JSON.toJSONString(nameList));
        //從 List 左側(cè)取出第一個元素,并移除
        Object name1 = listOp.leftPop("nameList", 200, TimeUnit.MILLISECONDS);
        System.out.println("is kim:" + name1.equals("kim"));
        //從 List 右側(cè)取出第一個元素菇存,并移除
        Object name2 = listOp.rightPop("nameList");
        System.out.println("is chuck:" + name2.equals("chuck"));
    }

    夸研。。依鸥。亥至。。贱迟。開源項目中還有內(nèi)容哦姐扮。。衣吠。茶敏。。缚俏。

}

本文示例讀者可以通過查看下面?zhèn)}庫中的項目惊搏,如下所示:

<module>springboot-redis</module>

作者:程序猿小亮
原文鏈接:https://blog.csdn.net/jiuqiyuliang/article/details/118677483?spm=1001.2014.3001.5502

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贮乳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胀屿,更是在濱河造成了極大的恐慌塘揣,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宿崭,死亡現(xiàn)場離奇詭異亲铡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)葡兑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門奖蔓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人讹堤,你說我怎么就攤上這事吆鹤。” “怎么了洲守?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵疑务,是天一觀的道長。 經(jīng)常有香客問我梗醇,道長知允,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任叙谨,我火速辦了婚禮温鸽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘手负。我一直安慰自己涤垫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布竟终。 她就那樣靜靜地躺著蝠猬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪统捶。 梳的紋絲不亂的頭發(fā)上吱雏,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機(jī)與錄音瘾境,去河邊找鬼。 笑死镰惦,一個胖子當(dāng)著我的面吹牛迷守,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旺入,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼兑凿,長吁一口氣:“原來是場噩夢啊……” “哼凯力!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起礼华,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤咐鹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后圣絮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祈惶,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年扮匠,在試婚紗的時候發(fā)現(xiàn)自己被綠了捧请。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡棒搜,死狀恐怖疹蛉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情力麸,我是刑警寧澤可款,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站克蚂,受9級特大地震影響闺鲸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陨舱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一翠拣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧游盲,春花似錦误墓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至莺奔,卻和暖如春欣范,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背令哟。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工恼琼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屏富。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓晴竞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狠半。 傳聞我的和親對象是個殘疾皇子噩死,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • JAVA && Spring && SpringBoot2.x — 學(xué)習(xí)目錄 Springboot拋棄了繁雜的xm...
    小胖學(xué)編程閱讀 7,580評論 1 13
  • 前邊我們已經(jīng)學(xué)習(xí)了 Redis 的一些基本命令颤难,以及通過 Jedis、Lettuce 來操作 Redis已维,但在實(shí)際...
    SheHuan閱讀 6,564評論 0 7
  • SpringBoot 中除了了對常用的關(guān)系型數(shù)據(jù)庫提供了優(yōu)秀的自動化測試以外行嗤,對于很多 NoSQL 數(shù)據(jù)庫一樣提供...
    進(jìn)擊的程序猿呀閱讀 236評論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭垛耳,有人歡樂有人憂愁栅屏,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,531評論 28 53
  • 信任包括信任自己和信任他人 很多時候艾扮,很多事情既琴,失敗、遺憾泡嘴、錯過甫恩,源于不自信,不信任他人 覺得自己做不成酌予,別人做不...
    吳氵晃閱讀 6,187評論 4 8