Redis (全稱: Remote Dictionary Server 遠(yuǎn)程字典服務(wù))是一個(gè)開源的使用 ANSI C語(yǔ)言 編寫、支持網(wǎng)絡(luò)毡证、可基于內(nèi)存亦可持久化的日志型共螺、 Key-Value數(shù)據(jù)庫(kù) 。
環(huán)境的搭建和安裝網(wǎng)上有很多教程情竹,在這里就不再重復(fù)了。
1. Redis 是什么匀哄?
Redis (全稱: Remote Dictionary Server 遠(yuǎn)程字典服務(wù))是一個(gè)開源的使用 ANSI C語(yǔ)言 編寫秦效、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型涎嚼、 Key-Value數(shù)據(jù)庫(kù) 阱州。
大家可能知道 Redis 是做緩存用的,它實(shí)際上也是一種數(shù)據(jù)庫(kù)法梯,可以對(duì)經(jīng)常使用到的數(shù)據(jù)進(jìn)行存儲(chǔ)苔货,也就是大家所說(shuō)的緩存。
官方給出的數(shù)據(jù)是立哑, Redis 能達(dá)到 10w+ 的 QPS( 每秒查詢速度 ) 夜惭。
為什么 Redis 的速度比 Mysql 等這種數(shù)據(jù)快呢?
因?yàn)?Redis 存儲(chǔ)的是 key-values 格式的數(shù)據(jù)铛绰,時(shí)間復(fù)雜度是 O(1) 诈茧,即直接通過(guò) key 查詢對(duì)應(yīng)的 value 。 而如 Mysql 數(shù)據(jù)庫(kù)捂掰,底層的實(shí)現(xiàn)是 B+ 樹敢会,時(shí)間復(fù)雜度是 O(logn) 。
最重要的一點(diǎn)是这嚣,數(shù)據(jù)庫(kù)的數(shù)據(jù)是存儲(chǔ)在磁盤中的鸥昏,而 Redis 是存儲(chǔ)在內(nèi)存當(dāng)中的,它們的速度差距不言而喻姐帚。但 Redis 也支持持久化存儲(chǔ)吏垮,這個(gè)后面的常見(jiàn)問(wèn)題里會(huì)提到。
2. Redis 數(shù)據(jù)類型
Redis 支持 5 種數(shù)據(jù)類型: string (字符串)罐旗、 hash (哈希)惫皱、 list (列表,有序可重復(fù))尤莺、 set (集合旅敷,無(wú)序不可重復(fù))、 zset (有序集合颤霎,有序不可重復(fù))媳谁。
Redis 中所有數(shù)據(jù)都是字符串涂滴, key 是區(qū)分大小寫的。
(1)string 是最基本的類型晴音,可以包含任何數(shù)據(jù)柔纵,但是 string 類型的值最大能存儲(chǔ) 512MB 。
(2)hash 的 value 相當(dāng)于一個(gè) map 锤躁, value 里面也有對(duì)應(yīng)的 key-value 搁料,特別適合存儲(chǔ)對(duì)象。一個(gè) hash 可以存儲(chǔ) 2^32-1 個(gè)鍵值對(duì)系羞,基本用不完郭计。并且可以修改某一個(gè)屬性值,所以一般用于存儲(chǔ)用戶或其他實(shí)體類的值椒振。
(3)list 中的 value 按照插入順序排序昭伸,可以在列表的頭部和尾部添加新元素。一般用于最新消息的排行或消息隊(duì)列澎迎。
(4)set 存放的是不重復(fù)值的集合庐杨,是無(wú)序的。并提供了求交集夹供、并集灵份、差集等操作,所以一般用于統(tǒng)計(jì)等功能哮洽。
(5)與 set 不同的是各吨, zset 是通過(guò)分?jǐn)?shù)( score )從小到大進(jìn)行排序的,我們可以指定每個(gè)值的分?jǐn)?shù)袁铐,分?jǐn)?shù)可以重復(fù)揭蜒。一般用于排行等功能。
3.Redis常用命令
基于對(duì)上面 5 種數(shù)據(jù)類型的了解剔桨,接著學(xué)習(xí)一下 Redis 常用命令屉更。更多了命令學(xué)習(xí),推薦大家看一看官方文檔?http://www.redis.cn/commands.html
(1)對(duì)stirng的操作
redis命令不區(qū)分大小寫洒缀。
下面命令中瑰谜,str就是key,hello就是value树绩,append為追加命令萨脑,如果原來(lái)沒(méi)有str,就新建一個(gè)饺饭。
append str hello? ? //對(duì)key為str的鍵追加hello字符串a(chǎn)ppend str redis//str的value變?yōu)閔elloredisset str1 1 ? //set命令設(shè)置一個(gè)key的value值 str1是key渤早,1是valueget str1 //get命令,獲取一個(gè)key的值 incr str1 //incr命令瘫俊,執(zhí)行加1操作鹊杖,比如str1的值會(huì)變成2悴灵,如果指定的key的value不能表示一個(gè)整數(shù),就會(huì)返回一個(gè)錯(cuò)誤decr str1 //減一操作
(2)對(duì)hash的操作
上面說(shuō)到過(guò)骂蓖,hash的value相當(dāng)于一個(gè)map积瞒,所以只設(shè)置值的時(shí)候myhash是key,h1是value里面的key登下,hello是h1的value
hset myhash h1 hello//設(shè)置一個(gè)key的value值hget myhash h1//返回hello茫孔,myhash為key,h1是value里面的key被芳,兩個(gè)都需要指定hlen myhash//獲取myhash的字段數(shù)量缰贝,這里返回1hkeys myhash//獲取myhash所以字段,這里返回h1
(3)對(duì)list的操作
mylst是key筐钟,a,b,c,d都是value,并且有順序赋朦,所以實(shí)際存進(jìn)去后是d,c,b,a
lpush mylist a b c d//lpush,從隊(duì)列左邊入隊(duì)一個(gè)或多個(gè)元素lrange mylist 0 -1//獲取指定范圍的值篓冲,從0開始,-1代表全部宠哄,注意這里返回d,c,b,a壹将。rpush mylist 1 2 3//從右邊入隊(duì),再次lrange的話就是d,c,b,a,1,2,3lpop mylist//從左邊彈出一個(gè)元素,這里彈出d,此時(shí)的mylist就沒(méi)有d了
(4)對(duì)set的操作
如果我們添加了重復(fù)的元素毛嫉,不會(huì)報(bào)錯(cuò)诽俯,但只會(huì)存一個(gè)。如a b b承粤,只會(huì)存a b
兩個(gè)集合之間不受影響暴区,即key為myset和myset2兩個(gè)集合里面都可以有a b
sadd myset a b c d//添加一個(gè)或多個(gè)元素到集合里面smembers myset//獲取集合里所有元素,輸出是無(wú)序的辛臊,隨機(jī)的仙粱。這里可能是b,d,c,asrem myset a c//移除myset中的a和c元素,由于不可能重復(fù)也沒(méi)順序彻舰,所以可以直接指定元素值來(lái)移除
(5)對(duì)zset的操作
myzset為key伐割,a b c前面的數(shù)字就是score
zadd myzset 2 b 1 a 3 c//添加一個(gè)或多個(gè)元素zrange myzset 0 -1//獲取指定范圍的值,0開始刃唤,-1代表全部隔心。這里返回a,b,c
更多的命令可以看上面網(wǎng)站中的文檔,寫的非常詳細(xì)尚胞,下面的常見(jiàn)問(wèn)題中也會(huì)提及一些硬霍。
4.Redis常見(jiàn)問(wèn)題
(1)在大量的key中查詢某一固定前綴的key
在實(shí)際的業(yè)務(wù)當(dāng)中,key的命名是有規(guī)范的笼裳,比如緩存用戶信息须尚,key的前綴可能會(huì)是user崖堤。
現(xiàn)在有幾千萬(wàn)條數(shù)據(jù),查詢user為前綴的key的話耐床,第一下想到的可能會(huì)是keys命令
keys user*//user*為正則表達(dá)式
其時(shí)間復(fù)雜度為O(n)密幔,雖然性能也算可以,但是在查詢幾千萬(wàn)條數(shù)據(jù)時(shí)明顯太慢了撩轰,花上幾分鐘都不稀奇胯甩,而且在查詢出來(lái)之前,可能會(huì)造成服務(wù)卡頓堪嫂,占用大量?jī)?nèi)存偎箫,顯然是不可取的。
那么這種情況就可以使用scan命令
下面的命令中皆串,math count為可選項(xiàng)淹办,可用可不用,所以需要顯示的寫出來(lái)恶复。math意味后面會(huì)匹配一個(gè)正則表達(dá)式怜森。count代表一次查詢10條。
這個(gè)10條不是強(qiáng)制的谤牡,可能會(huì)比10條少副硅。
scan 0 math user*? count 10//從0開始,查詢user為前綴的key翅萤,一次查詢10條并返回
執(zhí)行上面一句話后恐疲,會(huì)返回兩個(gè)東西,一個(gè)游標(biāo)套么,代表執(zhí)行到哪了培己,比如執(zhí)行到了14325。返回的另一個(gè)就是user為前綴的key了胚泌。
下次再執(zhí)行這條語(yǔ)句時(shí)漱凝,把0換成14325,接著上次的位置繼續(xù)查詢诸迟。但是游標(biāo)不一定是遞增的茸炒,也許下次的游標(biāo)比這次還小,所以存在重復(fù)的隱患阵苇。
我們可以在業(yè)務(wù)代碼處循環(huán)查詢壁公,記錄每次返回的游標(biāo),并把查詢的key存入到set當(dāng)中绅项,起到去重的效果紊册。
scan,實(shí)際上就是分批查詢,速度顯然沒(méi)有keys快囊陡,在查詢大量數(shù)據(jù)時(shí)芳绩,不會(huì)對(duì)服務(wù)器造成壓力。數(shù)據(jù)量不大時(shí)依舊推薦keys撞反。
(2)利用Redis實(shí)現(xiàn)分布式鎖
首先了解什么是分布式鎖妥色。即控制分布式系統(tǒng)訪問(wèn)共享資源的一種方式。
比如系統(tǒng)(或主機(jī))A和B都需要訪問(wèn)資源DataA時(shí)遏片,當(dāng)A先訪問(wèn)到了DataA嘹害,這時(shí)候就需要分布式鎖來(lái)把B擋住,防止A和B彼此干擾吮便,保證數(shù)據(jù)的一致性笔呀。
額外提一點(diǎn)就是,Redis命令的操作是原子性的髓需,原子性在數(shù)據(jù)庫(kù)的事務(wù)中有體現(xiàn)许师,Redis的命令也是原子性的,要么執(zhí)行要么不執(zhí)行僚匆,不會(huì)出現(xiàn)一個(gè)命令執(zhí)行到一半失敗了微渠,但還是改變了數(shù)據(jù)的問(wèn)題。
實(shí)現(xiàn)分布式鎖白热,需要解決一下幾個(gè)問(wèn)題:
1.互斥性敛助,即任意時(shí)刻只能有一個(gè)客戶端獲取鎖粗卜。
2.安全性屋确,鎖只能有持有它的客戶端刪除,不能由其他客戶端刪除续扔。
3.死鎖攻臀,即由于某些原因,一些客戶端出現(xiàn)問(wèn)題不能及時(shí)釋放鎖纱昧,導(dǎo)致其他客戶端也不能獲取鎖刨啸。
4.容錯(cuò),當(dāng)某些Redis節(jié)點(diǎn)出現(xiàn)問(wèn)題時(shí)识脆,客戶端也要能獲取到鎖设联。
我們可以用setnx實(shí)現(xiàn)鎖的功能。語(yǔ)法:setnx key value
僅當(dāng)key不存在時(shí)灼捂,才會(huì)設(shè)置成功离例。成功返回1,否則返回0悉稠。
1.在對(duì)應(yīng)的訪問(wèn)資源的業(yè)務(wù)代碼處宫蛆,對(duì)指定的key設(shè)值,如果成功了的猛,則代表沒(méi)有其他線程執(zhí)行過(guò)這段代碼耀盗,也就是沒(méi)有其他線程訪問(wèn)這個(gè)資源想虎。
如果設(shè)值失敗,就代表有其他線程占用該資源叛拷,就一直等待舌厨,直到setnx成功。
2.還有個(gè)問(wèn)題就是胡诗,這個(gè)key是長(zhǎng)期有效的邓线,所以還需要用到expire命令,語(yǔ)法:expire key seconds,seconds單位為秒煌恢,用以設(shè)置對(duì)應(yīng)key的過(guò)期時(shí)間骇陈。
上面兩步似乎好像是實(shí)現(xiàn)了鎖的功能,但是缺陷也非常明顯瑰抵,如果成功設(shè)值后你雌,在我設(shè)置時(shí)間之前客戶端就出現(xiàn)問(wèn)題了怎么辦??用兩個(gè)命令實(shí)現(xiàn)一個(gè)功能有悖于Redis的原子性?二汛。
在Redis2.6.12版本開始婿崭,set有兩個(gè)參數(shù),就是實(shí)現(xiàn)了以上兩個(gè)功能肴颊。雖然上面兩步分開的做法是錯(cuò)的氓栈,但是思路是一樣的。
具體語(yǔ)法:?set key value ex 10 nx?婿着。ex代表過(guò)期時(shí)間授瘦,這里設(shè)置10秒過(guò)期,nx代表key是要唯一的竟宋,即一個(gè)命令實(shí)現(xiàn)了以上兩個(gè)步驟提完。
最后還有一個(gè)小問(wèn)題,如果不同資源同時(shí)設(shè)置了鎖key丘侠,過(guò)期時(shí)間也是一樣的徒欣,到期后Redis同時(shí)刪除大量key時(shí),難免會(huì)出現(xiàn)卡頓蜗字。
解決方法就是在設(shè)置過(guò)期值時(shí)加上隨機(jī)值打肝。
3.利用Redis實(shí)現(xiàn)消息隊(duì)列
消息隊(duì)列,簡(jiǎn)稱MQ挪捕,即消息和隊(duì)列兩個(gè)單詞的首字母縮寫粗梭。常見(jiàn)的消息隊(duì)列有RabbitMQ和RocketMQ等,利用Redis實(shí)現(xiàn)消息隊(duì)列只是熟悉下其特點(diǎn)担神,實(shí)際當(dāng)中一般會(huì)使用專門的消息隊(duì)列中間件楼吃。
如果之前沒(méi)了解過(guò)消息隊(duì)列,建議搜索一下消息隊(duì)列相關(guān)知識(shí)進(jìn)行一下簡(jiǎn)單的學(xué)習(xí)。
簡(jiǎn)單地說(shuō)孩锡,消息隊(duì)列的作用就是接受客戶端的請(qǐng)求酷宵,然后對(duì)這些請(qǐng)求依次處理,一般應(yīng)用請(qǐng)求量特別大時(shí)躬窜,比如秒殺搶購(gòu)等浇垦。上面介紹數(shù)據(jù)類型時(shí)就說(shuō)到了list一般用于消息隊(duì)列。
看一下list的常見(jiàn)操作荣挨,雖然叫做列表男韧,但其特點(diǎn)和數(shù)據(jù)結(jié)構(gòu)的隊(duì)列基本一模一樣。所以在用Redis實(shí)現(xiàn)消息隊(duì)列時(shí)默垄,首先肯定會(huì)想到list此虑。
1.利用list的話,仿佛?使用rpush生產(chǎn)消息口锭,lpop消費(fèi)消息?就行了朦前。但是有一個(gè)小問(wèn)題,lpop不會(huì)等待rpush的鹃操,當(dāng)rpush還沒(méi)來(lái)得及生成數(shù)據(jù)時(shí)韭寸,這時(shí)lpop會(huì)直接返回null的。
2.既然要等待rpush生成數(shù)據(jù)荆隘,難免又會(huì)想到一個(gè)命令blpop,其語(yǔ)法為:blpop key seconds恩伺。 和lpop功能一樣,但是會(huì)等待指定的時(shí)間椰拒,這段時(shí)間內(nèi)rpush如果生成數(shù)據(jù)的話晶渠,blpop會(huì)及時(shí)返回。
3. 但是blpop的缺點(diǎn)也很明顯耸三,當(dāng)然這個(gè)缺點(diǎn)也存在于lpop當(dāng)中乱陡,就是blpop執(zhí)行完后浇揩,代表出隊(duì)仪壮,rpush生成的這條消息就沒(méi)了,而消息隊(duì)列中有的需求是需要多個(gè)消費(fèi)者去接收的胳徽。
這時(shí)候就可以用上?Redis的訂閱者模式?积锅,Redis客戶端可以訂閱任意數(shù)量的頻道(Topic)
在Redis當(dāng)中用subscribe命令訂閱一個(gè)頻道,語(yǔ)法subscribe topic养盗,topic就是自定義的頻道名稱缚陷,注意是topic不是key,?不需要事先定義往核,直接訂閱就行了箫爷。
然后用publish生產(chǎn)消息,語(yǔ)法publish topic value,topic就是你想發(fā)布到哪個(gè)頻道,value就是數(shù)據(jù)內(nèi)容虎锚,而訂閱了這個(gè)頻道的所有消費(fèi)者都會(huì)接收到消息硫痰。?注意是及時(shí)收到,不需要你再去手動(dòng)用命令獲取窜护。
訂閱者模式效斑,的確解決了以上兩種方法的缺點(diǎn),但是其缺陷也很明顯柱徙,就是只有處于訂閱者模式缓屠,也就是監(jiān)聽(tīng)狀態(tài)下,消費(fèi)者才會(huì)接受到生產(chǎn)者的消息护侮,也就是及時(shí)發(fā)送及時(shí)接收的敌完,一旦Redis客戶端下線,就永遠(yuǎn)不會(huì)接收到這個(gè)消息了羊初。
這就回到了前面說(shuō)到的一句話蠢挡,實(shí)際當(dāng)中會(huì)使用專門的消息隊(duì)列中間件來(lái)說(shuō)實(shí)現(xiàn)這些功能,以上三種方法或多或少可以實(shí)現(xiàn)消息隊(duì)列的功能凳忙,但是缺陷也非常明顯业踏。
4.Redis如何做持久化
Redis是基于內(nèi)存當(dāng)中的,那么肯定就會(huì)有疑問(wèn)了涧卵,當(dāng)我關(guān)閉主機(jī)或者關(guān)閉了Redis勤家,那Redis的數(shù)據(jù)是不是就全沒(méi)了。
持久化的作用就是柳恐,把Redis的數(shù)據(jù)存儲(chǔ)到磁盤當(dāng)中伐脖,以免Redis的數(shù)據(jù)丟失。
Redis有兩種持久化機(jī)制乐设,默認(rèn)的一種是RDB,另一種是AOF讼庇。
1.RDB(快照)持久化會(huì)在某個(gè)時(shí)間點(diǎn)保存全量的數(shù)據(jù),快照即針對(duì)內(nèi)存進(jìn)行的快速讀取技術(shù)近尚。而這個(gè)時(shí)間點(diǎn)可以由我們的實(shí)際業(yè)務(wù)進(jìn)行時(shí)間策略配置蠕啄。
RDB會(huì)按照時(shí)間周期策略對(duì)數(shù)據(jù)以快照的方式保存到磁盤里,并產(chǎn)生一個(gè)?dump.rdb的二進(jìn)制文件?戈锻。我們可以在redis.conf配置文件中save參數(shù)查看和配置時(shí)間策略歼跟。
dump.rdb文件是如何創(chuàng)建的呢??rdb文件可以通過(guò)兩個(gè)命令創(chuàng)建?格遭,一個(gè)是save,一個(gè)是bgsave哈街。 要注意這里的save是redis命令,上面提到的save是配置文件里面的參數(shù)拒迅。
save命令會(huì)阻塞Redis服務(wù)器進(jìn)程骚秦,直到rdb文件創(chuàng)建完成她倘,一般很少使用。
bgsave命令會(huì)fork出一個(gè)子進(jìn)程來(lái)創(chuàng)建rdb文件作箍,不會(huì)阻塞服務(wù)器進(jìn)程帝牡。fork即創(chuàng)建一個(gè)與父進(jìn)程幾乎一樣的子進(jìn)程。
bgsave的基本原理:當(dāng)我們使用bgsave命令時(shí)蒙揣,首先會(huì)檢查是否存在RDB/AOF子進(jìn)程正在進(jìn)行靶溜,有的話就返回錯(cuò)誤,即當(dāng)我們第一次執(zhí)行了bgsave懒震,在執(zhí)行完之前其他的bgsave會(huì)被拒絕執(zhí)行罩息。
如果沒(méi)有正在進(jìn)行的子進(jìn)程,就會(huì)調(diào)用redis源碼里面的rdbSaveBackground這個(gè)方法个扰,然后利用fork創(chuàng)建一個(gè)子進(jìn)程瓷炮。
RDB的缺點(diǎn):
1.1.前面提到,在某個(gè)時(shí)間點(diǎn)會(huì)進(jìn)行全量數(shù)據(jù)保存递宅,數(shù)據(jù)量大的話由于I/O而嚴(yán)重影響到性能娘香。
1.2.由于RDB是根據(jù)配置文件里面的時(shí)間策略進(jìn)行保存的,如果發(fā)生意外情況办龄,那么上次保存到當(dāng)前時(shí)間段內(nèi)的數(shù)據(jù)會(huì)發(fā)生丟失烘绽。
2.AOF(Append-Only-File)持久化 會(huì)以追加的方式(append)保存除了查詢指令以外所有變更的數(shù)據(jù),其默認(rèn)的文件名稱為?appendonly.aof?俐填。
AOF持久化默認(rèn)是關(guān)閉的安接,我們可以 在配置文件當(dāng)中找到appendonly參數(shù),把它的參數(shù)內(nèi)容改為yes英融。
前面說(shuō)到AOF文件會(huì)記錄所有非查詢的所有指令盏檐,最后肯定難以避免文件不斷增大的問(wèn)題,最主要的問(wèn)題是記錄的很多數(shù)據(jù)是不必要的驶悟。
比如循環(huán)更新一個(gè)數(shù)100次胡野,AOF會(huì)記錄這100個(gè)過(guò)程,而我們只需要最終結(jié)果就行了痕鳍。
所以硫豆, Redis提供了一個(gè)日志重寫的功能解決文件不斷增大的問(wèn)題 ,可以用BGREWRITEAOF命令手動(dòng)執(zhí)行额获。日志重寫在服務(wù)不中斷的情況下也能執(zhí)行够庙,?其基本原理如下?:
1.使用fork創(chuàng)建一個(gè)子進(jìn)程恭应。2.子進(jìn)程把新的AOF寫道一個(gè)臨時(shí)文件里抄邀,并不會(huì)依賴現(xiàn)有的AOF文件,只需要讀取內(nèi)存中的數(shù)據(jù)昼榛。這里就優(yōu)化了很多不必要的數(shù)據(jù)境肾。
2.主進(jìn)程這時(shí)候會(huì)依舊將新的變動(dòng)寫到內(nèi)存里剔难,也會(huì)寫到現(xiàn)有的AOF文件里,即使子進(jìn)程重寫失敗奥喻,數(shù)據(jù)也不會(huì)丟失偶宫。4.主進(jìn)程獲取到子進(jìn)程AOF重寫完成的信號(hào)后,會(huì)把新的變動(dòng)追加到新的AOF文件里环鲤。
3.最后使用新的AOF文件替換掉原來(lái)的AOF文件纯趋。
如果啟用了AOF持久化,Redis啟動(dòng)時(shí)會(huì)先檢查AOF文件是否存在冷离,如果存在就直接加載AOF文件吵冒,如果不存在就檢查RDB文件是否存在,如果存在就加載西剥,不存在就直接啟動(dòng)Redis痹栖。
在Redis4.0之后,推出了RDB-AOF混合持久化方式并作為默認(rèn)方式瞭空,RDB全量保存揪阿,AOF增量保存,集成了它們各自的優(yōu)點(diǎn)咆畏。
5.SpringBoot整合Redis
首先在依賴項(xiàng)里面添加redis啟動(dòng)器
spring-boot-starter-data-redis
然后在配置文件里面進(jìn)行相關(guān)的配置南捂,更多的配置可以看RedisProperties.java源碼查看。
spring.redis.host=127.0.0.1? ? #redis地址spring.redis.port=6379? ? #redis服務(wù)端口號(hào)
最后注入相關(guān)的類
//操作的是復(fù)雜類型旧找,比如各種實(shí)體類@AutowiredRedisTemplate redisTemplate//操作的是字符串@AutowiredStringRedisTemplate stringRedisTemplate
SpringBoot框架下對(duì)Redis的操作不像Jedis那樣可以直接使用原生的Redis命令黑毅,具體的API大家可以自行搜索相關(guān)的文檔。
不過(guò)推薦使用一些SpringBoot的Redis工具類钦讳,工具類會(huì)對(duì) RedisTemplate和StringRedisTemplate的方法進(jìn)行封裝矿瘦,而封裝后的方法名和Redis原生命令是一樣的。
最后愿卒,希望閱讀此文后能讓你軟件開發(fā)的過(guò)程中 缚去,能更好的學(xué)習(xí)Redis。另外小編分類整理了許多java進(jìn)階學(xué)習(xí)材料和BAT面試題琼开,需要資料的請(qǐng)轉(zhuǎn)發(fā)此文章后再私聊小編回復(fù)【java】就能領(lǐng)取2019年java進(jìn)階學(xué)習(xí)資料和BAT面試題以及《Effective Java》(第3版)電子版書籍易结。也可以加群:712263501領(lǐng)取海量學(xué)習(xí)資料進(jìn)行學(xué)習(xí)。