1. Redis的安裝過程
(1) 下載Redis
這里就隨便下,無論是安裝包也好壓縮包也好怎么都行
(2) 配置環(huán)境變量
配完了之后可以不需要進(jìn)入Redis的那個(gè)目錄,然后可以直接敲redis.....把這個(gè)服務(wù)啟動(dòng)起來。
(3) 把Redis變成一個(gè)服務(wù)
至少你在服務(wù)頁面估計(jì)能看到他,然后定成自動(dòng)啟動(dòng),省的天天手動(dòng)。
(4) 設(shè)置密碼
在Redis這個(gè)文件夾里面編輯redis.windows-service.conf,類似的conf文件有兩個(gè),千萬分清楚這個(gè)后面帶service的。
使用這種方式設(shè)置是永久性設(shè)置。
(5) 打開本地客戶端
如果要查詢里面的鍵值對是什么之類的,就用redis-cli。
設(shè)置了密碼之后,上來輸入的就是 auth 123456(根據(jù)自己的密碼改)
###########################################################
安裝、打開、設(shè)置密碼(就是配Redis環(huán)境)這些應(yīng)該也可以用docker完成
2. SpringBoot集成Redis
(1) 在pom里導(dǎo)入一個(gè)jar包
(2) yml配置
redis:
host: localhost # Redis服務(wù)器地址
database: 0 # Redis數(shù)據(jù)庫索引(默認(rèn)為0)
port: 6379 # Redis服務(wù)器連接端口
password:"test" # Redis服務(wù)器連接密碼(默認(rèn)為空,以及這里帶引號!!!)
jedis:
pool:
max-active: 8 # 連接池最大連接數(shù)(使用負(fù)值表示沒有限制),能制造出來的最大的連接數(shù)
max-wait: -1ms # 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒有限制)
max-idle: 8 # 連接池中的最大空閑連接,空閑太多可能銷毀
min-idle: 0 # 連接池中的最小空閑連接,務(wù)必保持幾個(gè)控線連接
timeout: 3000ms # 連接超時(shí)時(shí)間(毫秒)
(3) 注入Template開始用
經(jīng)過了上兩個(gè)步驟之后,其實(shí)就已經(jīng)配置好了,在代碼里面注入Template就可以set、get然后啟用了。
Teplate目前已知的有兩種,一種是RedisTemplate,一種是
StringRedisTemplate(這種其實(shí)也就是RedisTemplate<String,String>),就是封裝了一下寫的高大上了。
所以自己用的時(shí)候只能用RedisTemplate,如果需要的話自己寫泛型。
序列化器:
由于RedisTemplate里面注入的直接就是object,需要被緩存的類實(shí)現(xiàn)了Serielizable接口才行。
簡單寫一下Serielizable:
Java平臺允許我們在內(nèi)存中創(chuàng)建可復(fù)用的Java對象,但一般情況下,只有當(dāng)JVM處于運(yùn)行狀態(tài)時(shí),這些對象才能存在,即,這些對象的生命周期不會比JVM更長。但在現(xiàn)實(shí)中,就可能要求在JVM運(yùn)行停止后能夠保存(持久化),以便下次運(yùn)行時(shí)重新獲取對象,Java對象序列化就能夠幫助我們實(shí)現(xiàn)該功能。
網(wǎng)絡(luò)上遠(yuǎn)程傳遞的時(shí)候也需要實(shí)現(xiàn)這個(gè)功能。
如果僅僅只是讓某個(gè)類實(shí)現(xiàn)Serializable接口,而沒有其他處理的話,則就是使用默認(rèn)序列化機(jī)制。使用默認(rèn)機(jī)制,在序列化對象時(shí),不僅會序列化當(dāng)前對象本身,還會對該對象引用的其他對象也進(jìn)行序列化,同樣的,這些其他對象引用的另外對象也將被序列化,以此類推。所以,如果一個(gè)對象的成員變量是容器類對象,而這些容器含有的元素也是容器類對象,那么這個(gè)序列化對象的過程就會很復(fù)雜,開銷也很大。
transient關(guān)鍵字可以忽略掉某些字段。
3. Redis連接池
(1) 為什么要用連接池:
連接池定義:連接池是創(chuàng)建和管理一個(gè)連接的緩沖池的技術(shù),這些連接準(zhǔn)備好被任何需要它們的線程。
連接池管理的就是連接,每次存取數(shù)據(jù)的時(shí)候,都要new一個(gè)連接對象出來,建立一個(gè)TCP連接要經(jīng)歷三次握手什么的,這樣挺浪費(fèi)時(shí)間的,所以每次用完連接對象之后不釋放,存到連接池里面去,下次用連接對象的時(shí)候去連接池里面獲取。
(2) 手寫Redis連接池:
Redis連接池這東西一共就三個(gè)函數(shù),一個(gè)init,一個(gè)getResource,一個(gè)release。
其中尤其以getResources為核心。
首先如果要完成連接池保存,要有存儲容器,set、list、queue、array、map這些是要選擇一下的。
頻繁的存取,不能用array,不能用array的也不能用list,map不需要key,queue和set兩個(gè)平分,最終用queue。
那就要有兩個(gè)queue來放置空閑的和被使用的連接。
getResource的調(diào)用流程:(中間把config都用上了)
如果有空閑連接直接返回
沒有空閑的但是目前總數(shù)還沒超過max,可以再new一個(gè)
總數(shù)已經(jīng)到max了,沒法new了就只能等
如果超過了等待時(shí)間,返回報(bào)錯(cuò)
release調(diào)用流程:
把這個(gè)連接從使用中隊(duì)列移動(dòng)到空閑隊(duì)列