SpringBoot集成Redis並實現主從架構的實踐

今天這篇文章來和大傢分享一下在springboot中如何集成redis,並實現主從架構,進行數據的簡單存儲。

在這裡插入圖片描述

我的Redis是部署在Windows系統下面的,所以在這裡附上Redis在Windows環境下的安裝地址和安裝說明。

一、Windows環境下安裝Redis

首先去官網下載Redis的安裝包,官方下載地址:
https://github.com/tporadowski/redis/releases
在其中選擇當前版本即可。

下載之後解壓壓縮包,得到這樣的文件目錄:

打開cmd命令行,切換到該redis的文件目錄下。運行:

redis-server.exe redis.windows.conf

輸入之後,顯示這樣的頁面就說明Redis服務器運行成功瞭!

這個時候這個命令行窗口不要關閉,一旦關閉,Redis服務就停止瞭!這一點以後在開發的時候也是一樣的,需要註意!
現在打開一個新的cmd窗口,同樣定位到Redis的目錄下,
運行如下命令:

redis-cli.exe -h 127.0.0.1 -p 6379

運行這個命令的原因是連接到redis的服務器,其中的地址為本地地址,6379為redis的默認端口號,

設置鍵值對

因為我們知道Redis中數據的存儲都是以鍵值對的形式來到的,所以我們可以以鍵值對的形式來在Redis中存儲一個數據,書寫格式如下

set key value

比如存儲key為Mykey,value為huixiaoyuan的內容,則輸入

set Mykey huixiaoyuan

根據key獲取value

根據key來獲取value,我們可以直接以get的形式獲取。
如獲取我們剛才設置的key為Mykey的value值,那麼直接:

get Mykey

就可以獲取到對應的value值瞭,

這樣在Windows環境下Redis的安裝就算是完成瞭,以後在使用的過程中記得,Redis的窗口不要關閉就可以瞭。

二、SpringBoot連接Redis

springboot連接Redis時需要在pom文件中導入所需的jar包依賴,依賴如下:

        <!-- 加入jedis依賴 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

(1)使用Jedis類直接連接Redis服務器

在springboot環境下連接redis的方法有很多,首先最簡單的就是直接通過jedis類來連接,

jedis類就相當於是redis的客戶端表示。

連接方法如下:

    /**
     * redis連接測試01
     */
    @Test
    public void redisTest01() {
        //連接本地的 Redis 服務
        Jedis jedis = new Jedis("localhost");
        // 如果 Redis 服務設置瞭密碼,需要用下面這行代碼輸入密碼
        // jedis.auth("123456"); 
        System.out.println("連接成功");
        //查看服務是否運行
        System.out.println("服務正在運行: "+jedis.ping());
    }

運行後結果:

通過這種方式進行連接時,springboot會自動的去本地尋找redis服務器進行連接,如果沒有找到那麼就會報錯,

如果你去閱讀jedis的底層源碼,你會發現Jedis類有多種構造方法,常用的幾個是:

使用默認地址和端口

//不傳值,那麼使用默認的127.0.0.1地址,6379端口就訪問
public Jedis()

使用指定地址和默認端口

//隻傳入目的地址,那麼使用指定的地址和默認的端口號去訪問
public Jedis(String host)

使用指定地址和端口

//傳入目的地址和端口號,那麼使用指定的地址和端口號去訪問
public Jedis(String host, int port)

(2)通過配置文件進行連接

在springboot中,當然是可以通過配置文件的形式來設置各種連接參數瞭,Redis也是一樣的,

在yml文件中進行如下配置:

註意:這是沒有使用連接池的,如果使用連接池,需要在下邊增加配置,關於使用連接池的可以繼續往下看。

##redis配置信息
spring:
  redis:
    database: 0 #redis數據庫索引,默認為0
    host: 127.0.0.1 #redis服務器地址
    port: 6379 #redis服務器連接端口
    password: #redis服務器連接密碼,默認為null
    timeout: 5000 #redis連接超時時間

通過配置文件來進行配置之後,我們就可以使用springboot中的一個工具類來操作Redis的操作瞭,springboot會自動讀取配置文件中的配置信息,然後通過該配置信息去連接Redis服務器,springboot中提供操作Redis的工具類有兩個,分別是:StringRedisTemplate和RedisTemplate,

StringRedisTemplate和RedisTemplate的區別如下

  • 在進行序列化時,RedisTemplate使用的是 JdkSerializationRedisSerializer,而StringRedisTemplate使用的是StringRedisSerializer
  • StringRedisTemplate繼承瞭RedisTemplate<String,String>,而RedisTemplate 定義為 RedisTemplate<K, V>,所有StringRedisTemplate就限定瞭K,V為String類型的

相同處體現在他們對Redis的操作上,

RedisTemplate和StringRedisSerializer都定義瞭五種對Redis的操作,分別對應這Redis中的五種數據類型。

redisTemplate.opsForValue();  //操作字符串
redisTemplate.opsForHash();   //操作hash
redisTemplate.opsForList();   //操作list
redisTemplate.opsForSet();    //操作set
redisTemplate.opsForZSet();   //操作有序set

那麼在使用的時候,這兩個類應該如何選擇呢?

如果你的redis數據庫裡面本來存的是字符串數據,或者你要存取的數據就是字符串類型數據的時候,那麼你就使用StringRedisTemplate即可,

》但是如果你的數據是復雜的對象類型,而取出的時候又不想做任何的數據轉換,直接從Redis裡面取出一個對象,那麼使用RedisTemplate是更好的選擇。

接下來我以StringRedisSerializer為例子,來給大傢演示一下使用StringRedisSerializer操作Redis的方法,

    /**
     * springboot主從連接測試,
     * 使用springRedisTemplate操作
     */
    @Test
    public void redisTest06() {
//        操作字符型
        stringRedisTemplate.opsForValue().set("test06","Test06");
        System.out.println(stringRedisTemplate.opsForValue().get("test06"));

//        設置key的過期時間,30秒
        stringRedisTemplate.expire("test06", 30 * 1000, TimeUnit.MILLISECONDS);

//        根據key獲取過期時間
        Long test06ExpireTime = stringRedisTemplate.getExpire("test06");
        System.out.println("根據key獲取過期時間:" + test06ExpireTime);

//        根據key獲取過期時間,並且換算成指定單位
        Long test06ExpireTimeToUnit = stringRedisTemplate.getExpire("test06", TimeUnit.SECONDS);
        System.out.println("根據key獲取過期時間,並且換算成指定單位:" + test06ExpireTimeToUnit);

//        檢查key是否存在,返回佈爾類型
        Boolean test06IsExist = stringRedisTemplate.hasKey("test06");
        System.out.println("檢查key是否存在,返回佈爾類型:" + test06IsExist);

    }

在上面的操作中,有一點關於獲取和設置key過期時間的操作,當時在操作的時候對其進行瞭一下探究,在這裡分享給大傢

stringRedisTemplate中獲取過期時間的getExpire()方法的說明

  • 如果最開始沒有設置過期時間,那麼就返回-1,數據在沒有達到Redis數據最大限額的情況下會一直存在.
  • 如果設置瞭過期時間,但是數據還未過期,就返回剩餘時間,如果到瞭過期時間,那麼數據會被刪除
  • 如果數據被刪除或者不存在,那麼就返回-2.

三、使用連接池操作Redis

和使用mysql數據庫一樣,Redis在springboot中也是有連接池的,上面在yml中寫入配置文件的時候,我有和大傢說過可以在yml配置文件中寫入連接池參數,那麼配置如下:

##redis配置信息
spring:
  redis:
    database: 0 #redis數據庫索引,默認為0
    host: 127.0.0.1 #redis服務器地址
    port: 6379 #redis服務器連接端口
    password: #redis服務器連接密碼,默認為null
    timeout: 5000 #redis連接超時時間
    jedis:
      pool: #連接池配置
        max-active: 8 #連接池最大連接數
        max-wait: -1 #連接池最大阻塞等待時間
        max-idle: 8 #連接池中的最大空閑連接數
        min-idle: 0 #連接池中的最小空閑連接數

使用連接池時還有一種不需要寫入配置文件的方法,使用這種方法就需要在構造函數中傳入參數。
並且將配置信息寫入到配置類中,

當然,在進行實際的項目開發的時候,還是將配置信息寫入到配置文件中會好一點。

    /**
     * redis連接測試01
     * 建立簡單主從架構
     */
    @Test
    public void redisTest02() {
//        配置redis連接池
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//        在指定時刻通過連接池能夠獲取到的最大的jedis的數量
        jedisPoolConfig.setMaxTotal(20);
//        最大空閑jedis的數量
        jedisPoolConfig.setMaxIdle(10);
//        最小空閑jedis的數量
        jedisPoolConfig.setMinIdle(5);

//        建立redis連接池,設置本地地址,端口號,連接超時時間和讀寫超時時間,如果沒有連接密碼,那麼久為null
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, 300, null);

//        新建一個jedis,jedis:redis在Java中的客戶端實現
        Jedis jedis = null;
        try {
//            從連接池中獲取到一個jedis資源
            jedis = jedisPool.getResource();
//            設置key-value,並獲取value
            System.out.println(jedis.set("hxy", "888"));
            System.out.println(jedis.get("hxy"));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
//            註意!!這裡不是關閉連接,隻是將jedis歸還到連接池
            if (jedis != null) {
                jedis.close();
            }
        }
    }

以上是不使用配置文件的情況下,將參數傳入到Jdispool類中來實現連接池的,如果使用瞭配置文件,那麼直接調用Jdispool的無參構造即可瞭,其他的操作和上面代碼的都是一樣的,我就不重復寫瞭。

最後在操作完的時候,別忘瞭使用jedis.close();將jedis歸還到連接池即可!

到此這篇關於SpringBoot集成Redis並實現主從架構的文章就介紹到這瞭,更多相關SpringBoot集成Redis並實現主從架構內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: