SpringBoot集成Redis并實現(xiàn)主從架構(gòu)的實踐
今天這篇文章來和大家分享一下在springboot中如何集成redis,并實現(xiàn)主從架構(gòu),進行數(shù)據(jù)的簡單存儲。
我的Redis是部署在Windows系統(tǒng)下面的,所以在這里附上Redis在Windows環(huán)境下的安裝地址和安裝說明。
一、Windows環(huán)境下安裝Redis
首先去官網(wǎng)下載Redis的安裝包,官方下載地址:
https://github.com/tporadowski/redis/releases
在其中選擇當前版本即可。
下載之后解壓壓縮包,得到這樣的文件目錄:
打開cmd命令行,切換到該redis的文件目錄下。運行:
redis-server.exe redis.windows.conf
輸入之后,顯示這樣的頁面就說明Redis服務(wù)器運行成功了!
這個時候這個命令行窗口不要關(guān)閉,一旦關(guān)閉,Redis服務(wù)就停止了!這一點以后在開發(fā)的時候也是一樣的,需要注意!
現(xiàn)在打開一個新的cmd窗口,同樣定位到Redis的目錄下,
運行如下命令:
redis-cli.exe -h 127.0.0.1 -p 6379
運行這個命令的原因是連接到redis的服務(wù)器,其中的地址為本地地址,6379為redis的默認端口號,
設(shè)置鍵值對
因為我們知道Redis中數(shù)據(jù)的存儲都是以鍵值對的形式來到的,所以我們可以以鍵值對的形式來在Redis中存儲一個數(shù)據(jù),書寫格式如下
set key value
比如存儲key為Mykey,value為huixiaoyuan的內(nèi)容,則輸入
set Mykey huixiaoyuan
根據(jù)key獲取value
根據(jù)key來獲取value,我們可以直接以get的形式獲取。
如獲取我們剛才設(shè)置的key為Mykey的value值,那么直接:
get Mykey
就可以獲取到對應(yīng)的value值了,
這樣在Windows環(huán)境下Redis的安裝就算是完成了,以后在使用的過程中記得,Redis的窗口不要關(guān)閉就可以了。
二、SpringBoot連接Redis
springboot連接Redis時需要在pom文件中導入所需的jar包依賴,依賴如下:
<!-- 加入jedis依賴 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
(1)使用Jedis類直接連接Redis服務(wù)器
在springboot環(huán)境下連接redis的方法有很多,首先最簡單的就是直接通過jedis類來連接,
jedis類就相當于是redis的客戶端表示。
連接方法如下:
/** * redis連接測試01 */ @Test public void redisTest01() { //連接本地的 Redis 服務(wù) Jedis jedis = new Jedis("localhost"); // 如果 Redis 服務(wù)設(shè)置了密碼,需要用下面這行代碼輸入密碼 // jedis.auth("123456"); System.out.println("連接成功"); //查看服務(wù)是否運行 System.out.println("服務(wù)正在運行: "+jedis.ping()); }
運行后結(jié)果:
通過這種方式進行連接時,springboot會自動的去本地尋找redis服務(wù)器進行連接,如果沒有找到那么就會報錯,
如果你去閱讀jedis的底層源碼,你會發(fā)現(xiàn)Jedis類有多種構(gòu)造方法,常用的幾個是:
使用默認地址和端口
//不傳值,那么使用默認的127.0.0.1地址,6379端口就訪問 public Jedis()
使用指定地址和默認端口
//只傳入目的地址,那么使用指定的地址和默認的端口號去訪問 public Jedis(String host)
使用指定地址和端口
//傳入目的地址和端口號,那么使用指定的地址和端口號去訪問 public Jedis(String host, int port)
(2)通過配置文件進行連接
在springboot中,當然是可以通過配置文件的形式來設(shè)置各種連接參數(shù)了,Redis也是一樣的,
在yml文件中進行如下配置:
注意:這是沒有使用連接池的,如果使用連接池,需要在下邊增加配置,關(guān)于使用連接池的可以繼續(xù)往下看。
##redis配置信息 spring: redis: database: 0 #redis數(shù)據(jù)庫索引,默認為0 host: 127.0.0.1 #redis服務(wù)器地址 port: 6379 #redis服務(wù)器連接端口 password: #redis服務(wù)器連接密碼,默認為null timeout: 5000 #redis連接超時時間
通過配置文件來進行配置之后,我們就可以使用springboot中的一個工具類來操作Redis的操作了,springboot會自動讀取配置文件中的配置信息,然后通過該配置信息去連接Redis服務(wù)器,springboot中提供操作Redis的工具類有兩個,分別是:StringRedisTemplate和RedisTemplate,
StringRedisTemplate和RedisTemplate的區(qū)別如下
- 在進行序列化時,RedisTemplate使用的是 JdkSerializationRedisSerializer,而StringRedisTemplate使用的是StringRedisSerializer
- StringRedisTemplate繼承了RedisTemplate<String,String>,而RedisTemplate 定義為 RedisTemplate<K, V>,所有StringRedisTemplate就限定了K,V為String類型的
相同處體現(xiàn)在他們對Redis的操作上,
RedisTemplate和StringRedisSerializer都定義了五種對Redis的操作,分別對應(yīng)這Redis中的五種數(shù)據(jù)類型。
redisTemplate.opsForValue(); //操作字符串 redisTemplate.opsForHash(); //操作hash redisTemplate.opsForList(); //操作list redisTemplate.opsForSet(); //操作set redisTemplate.opsForZSet(); //操作有序set
那么在使用的時候,這兩個類應(yīng)該如何選擇呢?
如果你的redis數(shù)據(jù)庫里面本來存的是字符串數(shù)據(jù),或者你要存取的數(shù)據(jù)就是字符串類型數(shù)據(jù)的時候,那么你就使用StringRedisTemplate即可,
》但是如果你的數(shù)據(jù)是復雜的對象類型,而取出的時候又不想做任何的數(shù)據(jù)轉(zhuǎn)換,直接從Redis里面取出一個對象,那么使用RedisTemplate是更好的選擇。
接下來我以StringRedisSerializer為例子,來給大家演示一下使用StringRedisSerializer操作Redis的方法,
/** * springboot主從連接測試, * 使用springRedisTemplate操作 */ @Test public void redisTest06() { // 操作字符型 stringRedisTemplate.opsForValue().set("test06","Test06"); System.out.println(stringRedisTemplate.opsForValue().get("test06")); // 設(shè)置key的過期時間,30秒 stringRedisTemplate.expire("test06", 30 * 1000, TimeUnit.MILLISECONDS); // 根據(jù)key獲取過期時間 Long test06ExpireTime = stringRedisTemplate.getExpire("test06"); System.out.println("根據(jù)key獲取過期時間:" + test06ExpireTime); // 根據(jù)key獲取過期時間,并且換算成指定單位 Long test06ExpireTimeToUnit = stringRedisTemplate.getExpire("test06", TimeUnit.SECONDS); System.out.println("根據(jù)key獲取過期時間,并且換算成指定單位:" + test06ExpireTimeToUnit); // 檢查key是否存在,返回布爾類型 Boolean test06IsExist = stringRedisTemplate.hasKey("test06"); System.out.println("檢查key是否存在,返回布爾類型:" + test06IsExist); }
在上面的操作中,有一點關(guān)于獲取和設(shè)置key過期時間的操作,當時在操作的時候?qū)ζ溥M行了一下探究,在這里分享給大家
stringRedisTemplate中獲取過期時間的getExpire()方法的說明
- 如果最開始沒有設(shè)置過期時間,那么就返回-1,數(shù)據(jù)在沒有達到Redis數(shù)據(jù)最大限額的情況下會一直存在.
- 如果設(shè)置了過期時間,但是數(shù)據(jù)還未過期,就返回剩余時間,如果到了過期時間,那么數(shù)據(jù)會被刪除
- 如果數(shù)據(jù)被刪除或者不存在,那么就返回-2.
三、使用連接池操作Redis
和使用mysql數(shù)據(jù)庫一樣,Redis在springboot中也是有連接池的,上面在yml中寫入配置文件的時候,我有和大家說過可以在yml配置文件中寫入連接池參數(shù),那么配置如下:
##redis配置信息 spring: redis: database: 0 #redis數(shù)據(jù)庫索引,默認為0 host: 127.0.0.1 #redis服務(wù)器地址 port: 6379 #redis服務(wù)器連接端口 password: #redis服務(wù)器連接密碼,默認為null timeout: 5000 #redis連接超時時間 jedis: pool: #連接池配置 max-active: 8 #連接池最大連接數(shù) max-wait: -1 #連接池最大阻塞等待時間 max-idle: 8 #連接池中的最大空閑連接數(shù) min-idle: 0 #連接池中的最小空閑連接數(shù)
使用連接池時還有一種不需要寫入配置文件的方法,使用這種方法就需要在構(gòu)造函數(shù)中傳入?yún)?shù)。
并且將配置信息寫入到配置類中,
當然,在進行實際的項目開發(fā)的時候,還是將配置信息寫入到配置文件中會好一點。
/** * redis連接測試01 * 建立簡單主從架構(gòu) */ @Test public void redisTest02() { // 配置redis連接池 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 在指定時刻通過連接池能夠獲取到的最大的jedis的數(shù)量 jedisPoolConfig.setMaxTotal(20); // 最大空閑jedis的數(shù)量 jedisPoolConfig.setMaxIdle(10); // 最小空閑jedis的數(shù)量 jedisPoolConfig.setMinIdle(5); // 建立redis連接池,設(shè)置本地地址,端口號,連接超時時間和讀寫超時時間,如果沒有連接密碼,那么久為null JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, 300, null); // 新建一個jedis,jedis:redis在Java中的客戶端實現(xiàn) Jedis jedis = null; try { // 從連接池中獲取到一個jedis資源 jedis = jedisPool.getResource(); // 設(shè)置key-value,并獲取value System.out.println(jedis.set("hxy", "888")); System.out.println(jedis.get("hxy")); } catch (Exception e) { e.printStackTrace(); } finally { // 注意!!這里不是關(guān)閉連接,只是將jedis歸還到連接池 if (jedis != null) { jedis.close(); } } }
以上是不使用配置文件的情況下,將參數(shù)傳入到Jdispool類中來實現(xiàn)連接池的,如果使用了配置文件,那么直接調(diào)用Jdispool的無參構(gòu)造即可了,其他的操作和上面代碼的都是一樣的,我就不重復寫了。
最后在操作完的時候,別忘了使用jedis.close();將jedis歸還到連接池即可!
到此這篇關(guān)于SpringBoot集成Redis并實現(xiàn)主從架構(gòu)的文章就介紹到這了,更多相關(guān)SpringBoot集成Redis并實現(xiàn)主從架構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基礎(chǔ)之finally語句與return語句詳解
這篇文章主要介紹了Java基礎(chǔ)之finally語句與return語句詳解,文中有非常詳細的代碼示例,對正在學習java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Intellij IDEA如何自定義注釋模板的實現(xiàn)方法
這篇文章主要介紹了Intellij IDEA如何自定義注釋模板的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05解決Mybatis返回update后影響的行數(shù)問題
這篇文章主要介紹了解決Mybatis返回update后影響的行數(shù)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11