SpringBoot連接Redis(SpringBoot學習三)

SpringBoot連接Redis

​ 下面就開始練習連接Redis,這裏也是沒有集成web模塊。web模塊感覺這些東西也沒有必要。連接池這裏可以講一下,上一篇MySQL的連接池放在Mybatis那裏再講,估計也快了,如果不出意外的話。。。

​ 首先安裝Redis和配置Redis的信息,這裏不再累述,我之前的博客也有。剛纔看了一下,我之前的博客講的還挺詳細的,我這次有可能重複了,儘量講講之前沒有講到的。

​ 仍然是添加依賴,因爲Redis官方開發了一個連接工具Jedis,這個工具挺好用的。

        <!--  Redis依賴      -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--  不添加這個依賴會導致RedisTemplate無法注入      -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

​ 下面就是配置Redis連接和連接池信息。

#Redis依賴
# Redis服務器地址
spring.redis.host=127.0.0.1
# Redis數據庫索引(默認爲0)
spring.redis.database=0
# Redis服務器連接端口
spring.redis.port=6379
# Redis服務器連接密碼(默認爲空)
spring.redis.password=自己的密碼
# 連接超時時間(毫秒)
spring.redis.timeout=1000
## 連接池最大連接數(使用負值表示沒有限制)
spring.redis.lettuce.pool.max-active=200
## 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.lettuce.pool.max-wait=-1
## 連接池中的最大空閒連接
spring.redis.lettuce.pool.max-idle=10
## 連接池中的最小空閒連接
spring.redis.lettuce.pool.min-idle=0

​ 下面就開始編寫代碼,需要注意的是代碼中引用的類是StringRedisTemplate,有一些不同的地方。

  • RedisTemplate,RedisTemplate是最基本的操作類,它默認的序列化方式是JdkSerializationRedisSerializer,在存值時,鍵值會被序列化爲字節數組,可讀性差,取值時也是一樣,如果redis中存的值正常的字符串形式,取值時將返回null。

  • StringRedisTemplateStringRedisTemplate繼承於 RedisTemplate<String, String>,默認的序列化方式是StringRedisSerializer,存值取值都是按照字符串的形式。

    代碼如下,但是中間遇到了一些問題,解決起來很蛋疼。下面說說,最開始使用的是上面的依賴,但是啓動一直報錯,一開始懷疑注入的方式不對,把@Resource換成@Autowired,結果還是不行,又懷疑方法不能正常調用(菜鳥的智障懷疑),後來又排除了。在網上找了一圈,懷疑redis版本的問題,換成了jedis,結果就可以了。然後就認爲是依賴的版本問題,生菜(最新redis使用的)和目前的SpringBoot融合的不是很好。

    package com.psq.train.redis;
    
    import com.psq.train.mysql.TestUser;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.Resource;
    
    /**
     * RedisTrain.java
     * Description: Redis練習
     *
     * @author Peng Shiquan
     * @date 2020/5/31
     */
    @Component
    public class RedisTrain {
    
        /**
         * 使用StringRedisTemplate,類似於RedisTemplate<String,String>
         */
        @Resource
        private StringRedisTemplate stringRedisTemplate;
    
        /**
         * Description: Redis練習的主方法
         *
         * @param
         * @return void
         * @Author: Peng Shiquan
         * @Date: 2020/5/31
         */
        @PostConstruct
        public void redisTrainmain() {
            TestUser testUser = new TestUser();
            testUser.setId(3);
            testUser.setName("張三");
            testUser.setPassword("1234567");
            System.err.println("下面開始Redis插入");
            redisTrainInsert(testUser);
            System.err.println("下面開始查詢");
            redisTrainSelect(testUser.getName());
        }
    
        /**
         * Description: redis插入方法
         *
         * @param testUser
         * @return void
         * @Author: Peng Shiquan
         * @Date: 2020/6/1
         */
        public void redisTrainInsert(TestUser testUser) {
            String key = testUser.getName();
            String value = testUser.toString();
            stringRedisTemplate.opsForValue().set(key, value);
            System.err.println("存儲成功,存儲對象爲:key:" + key + ",value:" + value);
        }
    
        /**
         * Description: redis查詢方法
         *
         * @param name
         * @return void
         * @Author: Peng Shiquan
         * @Date: 2020/6/1
         */
        public void redisTrainSelect(String name) {
            System.err.println("需要查詢的name爲:" + name);
            System.err.println(name);
            String value = stringRedisTemplate.opsForValue().get(name);
            System.err.println("查詢到到結果爲:" + value);
        }
    }
    
  • LettuceJedis的都是連接Redis Server的客戶端程序。Jedis實現上是直連redis server,多線程環境下非線程安全,除非使用連接池,爲每個Jedis實例增加物理連接Lettuce基於Netty的連接實例(StatefulRedisConnection),可以在多個線程間併發訪問,且線程安全,滿足多線程環境下的併發訪問,同時它是可伸縮的設計,一個連接實例不夠的情況也可以按需增加連接實例

    我也這樣認爲,直到我再次啓動的時候,發現下面一個問題。 image-20200601090901717

    如上圖,最後顯示的是一個密碼的問題,是客戶端配置了密碼,但是服務端沒有配置密碼,我又查看了redis啓動的時候,沒有使用正確的配置文件。

image-20200601092939704

​ 配置了密碼後,一切都解決了。真是一個SB問題,果然是老了。。。

​ 剩下就遺留了一個問題,我看別人的demo都寫了一個redis配置類,估計是爲了定製自己的RedisTemplate,我這裏沒有什麼定製的,就是簡單的用了一下,所以沒有寫redis配置類。如果我說錯了,大家也指點一下。

​ 就這樣吧,結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章