Redis六大數(shù)據(jù)類型使用方法詳解
我們說(shuō) Redis 相對(duì)于Memcache 等其他的緩存產(chǎn)品,有一個(gè)比較明顯的優(yōu)勢(shì)就是 Redis 不僅僅支持簡(jiǎn)單的key-value類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。本篇博客我們就將介紹這些數(shù)據(jù)類型的詳細(xì)使用以及順帶介紹Redis系統(tǒng)的相關(guān)命令用法。
注意:Redis的命令不區(qū)分大小寫,但是key 嚴(yán)格區(qū)分大小寫?。?!
0、寫在前面
下面介紹的Redis命令有很多,如果你想通過(guò)死記硬背來(lái)記住這些命令幾乎不可能,但是如果理解了Redis的一些機(jī)制,這些命令其實(shí)是由很強(qiáng)的通用性的,通過(guò)理解來(lái)記憶是最好的。 另外,每種數(shù)據(jù)類型都有其適合的使用場(chǎng)景,我也會(huì)在文中給與說(shuō)明,如果濫用,反而會(huì)適得其反。
1、string 數(shù)據(jù)類型
string 是Redis的最基本的數(shù)據(jù)類型,可以理解為與 Memcached 一模一樣的類型,一個(gè)key 對(duì)應(yīng)一個(gè) value。string 類型是二進(jìn)制安全的,意思是 Redis 的 string 可以包含任何數(shù)據(jù),比如圖片或者序列化的對(duì)象,一個(gè) redis 中字符串 value 最多可以是 512M。
①、相關(guān)命令介紹
string 數(shù)據(jù)類型在 Redis 中的相關(guān)命令:
PS:
?、?、上面的 ttl 命令是返回 key 的剩余過(guò)期時(shí)間,單位為秒。
?、凇set和mget這種批量處理命令,能夠極大的提高操作效率。因?yàn)橐淮蚊顖?zhí)行所需要的時(shí)間=1次網(wǎng)絡(luò)傳輸時(shí)間+1次命令執(zhí)行時(shí)間,n個(gè)命令耗時(shí)=n次網(wǎng)絡(luò)傳輸時(shí)間+n次命令執(zhí)行時(shí)間,而批量處理命令會(huì)將n次網(wǎng)絡(luò)時(shí)間縮減為1次網(wǎng)絡(luò)時(shí)間,也就是1次網(wǎng)絡(luò)傳輸時(shí)間+n次命令處理時(shí)間。
但是需要注意的是,Redis是單線程的,如果一次批量處理命令過(guò)多,會(huì)造成Redis阻塞或網(wǎng)絡(luò)擁塞(傳輸數(shù)據(jù)量大)。
?、?、setnx可以用于實(shí)現(xiàn)分布式鎖,具體實(shí)現(xiàn)方式后面會(huì)介紹。
上面是 string 類型的基本命令,下面介紹幾個(gè)自增自減操作,這在實(shí)際工作中還是特別有用的(分布式環(huán)境中統(tǒng)計(jì)系統(tǒng)的在線人數(shù),利用Redis的高性能讀寫,在Redis中完成秒殺,而不是直接操作數(shù)據(jù)庫(kù)。)。
②、典型使用場(chǎng)景
一、計(jì)數(shù)
由于Redis單線程的特點(diǎn),我們不用考慮并發(fā)造成計(jì)數(shù)不準(zhǔn)的問(wèn)題,通過(guò) incrby 命令,我們可以正確的得到我們想要的結(jié)果。
二、限制次數(shù)
比如登錄次數(shù)校驗(yàn),錯(cuò)誤超過(guò)三次5分鐘內(nèi)就不讓登錄了,每次登錄設(shè)置key自增一次,并設(shè)置該key的過(guò)期時(shí)間為5分鐘后,每次登錄檢查一下該key的值來(lái)進(jìn)行限制登錄。
2、hash 數(shù)據(jù)類型
hash 是一個(gè)鍵值對(duì)集合,是一個(gè) string 類型的 key和 value 的映射表,key 還是key,但是value是一個(gè)鍵值對(duì)(key-value)。類比于 Java里面的 Map<String,Map<String,Object>> 集合。
①、相關(guān)命令介紹
演示如下:
②、典型使用場(chǎng)景
查詢的時(shí)間復(fù)雜度是O(1),用于緩存一些信息。
3、list 數(shù)據(jù)類型
list 列表,它是簡(jiǎn)單的字符串列表,按照插入順序排序,你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊),它的底層實(shí)際上是個(gè)鏈表。
列表有兩個(gè)特點(diǎn):
一、有序
二、可以重復(fù)
這兩個(gè)特點(diǎn)要注意和后面介紹的集合和有序集合相對(duì)比。
①、相關(guān)命令介紹
②、典型使用場(chǎng)景
一、棧
通過(guò)命令 lpush+lpop
二、隊(duì)列
命令 lpush+rpop
三、有限集合
命令 lpush+ltrim
四、消息隊(duì)列
命令 lpush+brpop
4、set 數(shù)據(jù)類型
Redis 的 set 是 string 類型的無(wú)序集合。
相對(duì)于列表,集合也有兩個(gè)特點(diǎn):
一、無(wú)序
二、不可重復(fù)
①、相關(guān)命令介紹
②、典型使用場(chǎng)景
利用集合的交并集特性,比如在社交領(lǐng)域,我們可以很方便的求出多個(gè)用戶的共同好友,共同感興趣的領(lǐng)域等。
5、zset 數(shù)據(jù)類型
zset(sorted set 有序集合),和上面的set 數(shù)據(jù)類型一樣,也是 string 類型元素的集合,但是它是有序的。
①、相關(guān)命令介紹
②、典型使用場(chǎng)景
和set數(shù)據(jù)結(jié)構(gòu)一樣,zset也可以用于社交領(lǐng)域的相關(guān)業(yè)務(wù),并且還可以利用zset 的有序特性,還可以做類似排行榜的業(yè)務(wù)。
6、Redis5.0新數(shù)據(jù)結(jié)構(gòu)-stream
Redis的作者在Redis5.0中,放出一個(gè)新的數(shù)據(jù)結(jié)構(gòu),Stream。Redis Stream 的內(nèi)部,其實(shí)也是一個(gè)隊(duì)列,每一個(gè)不同的key,對(duì)應(yīng)的是不同的隊(duì)列,每個(gè)隊(duì)列的元素,也就是消息,都有一個(gè)msgid,并且需要保證msgid是嚴(yán)格遞增的。在Stream當(dāng)中,消息是默認(rèn)持久化的,即便是Redis重啟,也能夠讀取到消息。那么,stream是如何做到多播的呢?其實(shí)非常的簡(jiǎn)單,與其他隊(duì)列系統(tǒng)相似,Redis對(duì)不同的消費(fèi)者,也有消費(fèi)者Group這樣的概念,不同的消費(fèi)組,可以消費(fèi)同一個(gè)消息,對(duì)于不同的消費(fèi)組,都維護(hù)一個(gè)Idx下標(biāo),表示這一個(gè)消費(fèi)群組消費(fèi)到了哪里,每次進(jìn)行消費(fèi),都會(huì)更新一下這個(gè)下標(biāo),往后面一位進(jìn)行偏移。
7、系統(tǒng)相關(guān)命令
8、key 相關(guān)命令
關(guān)于 key 的命令應(yīng)該說(shuō)是最常用的,需要大家記住。
這里在介紹一個(gè)命令 :
OBJECT ENCODING key
這是用來(lái)顯示這五種數(shù)據(jù)類型的底層數(shù)據(jù)結(jié)構(gòu),下一篇博客我們會(huì)詳細(xì)介紹。
上面的命令我們給string 數(shù)據(jù)類型 k1 復(fù)制str,給 k2 復(fù)制123,通過(guò) OBJECT ENCODING 顯示底層實(shí)現(xiàn)的數(shù)據(jù)類型分別是 embstr 和 int。
參考文檔:http://www.redis.cn/commands.html
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java 服務(wù)端消息推送的實(shí)現(xiàn)小結(jié)
本文主要介紹了Java 服務(wù)端消息推送的實(shí)現(xiàn)小結(jié),主要包括四種常見的消息實(shí)時(shí)推送方案:短輪詢、長(zhǎng)輪詢、SSE?和?WebSocket,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Spring RedirectAttributes參數(shù)跳轉(zhuǎn)代碼實(shí)例
這篇文章主要介紹了Spring RedirectAttributes參數(shù)跳轉(zhuǎn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04SpringBoot集成內(nèi)存數(shù)據(jù)庫(kù)H2的實(shí)踐
h2是內(nèi)存數(shù)據(jù)庫(kù),查詢高效,可以在開發(fā)初期使用它。本文主要介紹了SpringBoot集成內(nèi)存數(shù)據(jù)庫(kù)H2的實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2021-09-09Java如何利用return結(jié)束方法調(diào)用
這篇文章主要介紹了Java如何利用return結(jié)束方法調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02SpringBoot基礎(chǔ)教程之集成郵件服務(wù)
這篇文章主要給大家介紹了關(guān)于SpringBoot基礎(chǔ)教程之集成郵件服務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07java運(yùn)行錯(cuò)誤A JNI error的解決方案
這篇文章主要介紹了java運(yùn)行錯(cuò)誤A JNI error的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08SpringBoot打Jar包在命令行運(yùn)行流程詳解
這篇文章主要介紹了SpringBoot打Jar包在命令行運(yùn)行流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09