您好,登錄后才能下訂單哦!
Redis的數(shù)據(jù)結(jié)構(gòu)
Redis支持多種不同的數(shù)據(jù)結(jié)構(gòu),包括5種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)和幾種比較復(fù)雜的數(shù)據(jù),這些數(shù)據(jù)結(jié)構(gòu)可以滿足不同的應(yīng)用場景。
五種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)
String:字符串,是構(gòu)建其他數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)
Hash:哈希列表
List:列表
Set:集合,在哈希列表的基礎(chǔ)上實(shí)現(xiàn)
Sort Set:有序集合
復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
Bitmaps:位圖,在string的基礎(chǔ)上進(jìn)行位操作,可以實(shí)現(xiàn)節(jié)省空間的數(shù)據(jù)結(jié)構(gòu)。
Hyperloglog:用于估計(jì)一個(gè) set 中元素?cái)?shù)量的概率性的數(shù)據(jù)結(jié)構(gòu)。
Geo:geospatial,地理空間索引半徑查詢。
BloomFilter:布隆過濾器。
不同數(shù)據(jù)結(jié)構(gòu)的相同之處
從上面的介紹,我們看到支持的數(shù)據(jù)結(jié)構(gòu)的不同,但其實(shí),Redis的每一種數(shù)據(jù)結(jié)構(gòu)都由一個(gè)key和value組成,可以抽象為:
而所有數(shù)據(jù)結(jié)構(gòu)的key的值都是任意合法的字符串,不同的數(shù)據(jù)結(jié)構(gòu)的區(qū)別就在于value存儲的值的不同而不同。
比如,最簡簡單的String數(shù)據(jù)結(jié)構(gòu),其value為String,所以String可以表示為:
而Hash數(shù)據(jù)結(jié)構(gòu),其value為一個(gè)哈希列表,所以Hash可以表示為:
這里就列出String和Hash來講解說明,關(guān)于更多數(shù)據(jù)結(jié)構(gòu)的內(nèi)部結(jié)構(gòu)及詳細(xì)操作,我們在之后的文章在再談?wù)劙伞?/p>
歡迎大家關(guān)注我的公種浩【程序員追風(fēng)】,文章都會在里面更新,整理的資料也會放在里面。
Redis的通用命令
Redis官網(wǎng)將Redis的命令按照功能劃分為15個(gè)主題分組,其中,Kyes主題的命令對所有的數(shù)據(jù)結(jié)構(gòu)都通用,因此,有必要在了解其他數(shù)據(jù)結(jié)構(gòu)命令前好好學(xué)習(xí)一下。
keys
keys命令的作用是列出Redis所有的key,該命令的時(shí)間復(fù)雜度為O(N),N隨著Redis中key的數(shù)量增加而增加,因此Redis有大量的key,keys命令會執(zhí)行很長時(shí)間,而由于Redis是單線程,某個(gè)命令耗費(fèi)過長時(shí)間,則會導(dǎo)致后面的的所有請求無法得到響應(yīng),因此,千萬不要在生產(chǎn)服務(wù)器上使用keys命令。
#?key命令,時(shí)間復(fù)雜度為O(n) keys?pattern?#pattern可為一個(gè)包含匹配模式的字符串,可以包含*,+,?,[a-z]等模式。
示例
>?mset?hello_test1?one?hello_test2?two?helloa?a?hellob?b >?keys?hello* 1)?"hello_test1" 2)?"hello_test2" 3)?"helloa" 4)?"hellob" >?keys?heelo? 1)?"helloa" 2)?"hellob" >?keys?hello[a-z] 1)?"helloa" 2)?"hellob"
exists
exists命令用于判斷一個(gè)或多個(gè)key是否存在,判斷多個(gè)key時(shí),key之間用空格分隔,exists的返回值為整數(shù),表示當(dāng)前判斷有多少個(gè)key是存在的。
#?exists命令,時(shí)間復(fù)雜度O(1) exists?key?[key?...]
示例
>?set?test1?t1 >?exists?test1?test2? (integer)?1?#只有一個(gè)key存在 >?exists?test3?test3 (integer)?0?#key都不存在
del
del命令用于刪除一個(gè)或多個(gè)key,多個(gè)key之間用空格分隔,其返回值為整數(shù),表示成功刪除了多少個(gè)存在的key,因此,如果只刪除一個(gè)key,則可以從返回值中判斷是否成功,如果刪除多個(gè)key,則只能得到刪除成功的數(shù)量。
#?del命令,時(shí)間復(fù)雜度O(n) del?key?[key?...]
示例
>?set?test?t >?del?test (integer)?1 >?mset?test1?2?test2?1 >?del?test1?test2?test3 (integer)?2?#?返回2,表示成功刪除兩個(gè) #再次刪除,返回0,因?yàn)閯h除成功個(gè)數(shù)為0 >?del?test1?test2?test3 (integer)?0
expire,pexpire
expire設(shè)置key在多少秒之后過期,pexpire設(shè)置key在多少毫秒之后過期,成功返回1,失敗返回0。
#?expire命令,時(shí)間復(fù)雜度為O(1) expire?key?seconds #?pexpire命令,時(shí)間復(fù)雜度為O(1) pexpire?key?milliseconds
示例
>?mset?test?test_value?test1?test1_value >?expire?test?10?#設(shè)置10秒后過期 (integer)?1 >?pexpire?test1_value?10000?#設(shè)置10000毫秒(10s)后過期 (integer)?1 >?expire?ttt?100 (integer)?0?#?不存在的key,設(shè)置失敗,返回0
ttl,pttl
ttl和pttl命令用于獲取key的過期時(shí)間,其返回值為整型,代表的意義分為幾種情況:
當(dāng)key不存在或過期時(shí)間,返回-2。
當(dāng)key存在且永久有效時(shí),返回-1。
當(dāng)key有設(shè)置過期時(shí)間時(shí),返回為剩下的秒數(shù)(pttl為毫秒數(shù))
#?ttl命令,時(shí)間復(fù)雜度O(1) ttl?key #?pttl命令,時(shí)間復(fù)雜度O(1) pttl?key
示例(ttl的演示,pttl類似)
>?set?test?test >?expire?test?100 >?ttl?test (integer)?98#返回剩下的秒數(shù) >?set?test1?#永久有效 >?ttl?test1 (integer)?-1 >?ttl?test2 (integer)?-2#不存在或過期 #100秒后 >?ttl?test?#?test已過期 (integer)?-2
expireat,pexpireat
設(shè)置key在某個(gè)時(shí)間戳過期,expreat參數(shù)時(shí)間戳用秒表示,而pexpireat則用毫秒表示,與expire和pexpire功能類似,返回1表示成功,0表示失敗。
#expireat命令,時(shí)間復(fù)雜度為O(1) expireat?key?timestamp #pexpireat命令,時(shí)間復(fù)雜度為O(1) pexpireat?key?milliseconds-timestamp
示例
>?set?test?test >?expireat?test?1560873600?#?2019-06-19?00:00:00 (integer)?1 >?set?test1?test1 >?pexpireat?test1?156087360000?#?2019-06-19?00:00:00的毫秒表示 (integer)?1
persist
移除key的過期時(shí)間,將key設(shè)置為永久有效,當(dāng)key設(shè)置了過期時(shí)間,使用persist命令移除后返回1,如果key不存在或本身就是永久有效的,則返回0。
#?persist命令,時(shí)間復(fù)雜度O(1) persist?key
示例
>?set?test?test >?ttl?test (integer)?-1?#?表示永久有效 >?persist?test (integer)?0?#?對永久有效或不存在的key使用persist命令,返回 >?expire?test?10 (integer)?1 >?persist?test (integer)?1
type
判斷key是什么類型的數(shù)據(jù)結(jié)構(gòu),返回值為string,list,set,hash,zset,分別表示我們前面介紹的Redis的5種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)。
geo,hyperloglog,bitmaps等復(fù)雜的數(shù)據(jù)結(jié)構(gòu),都是在這五種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)上實(shí)現(xiàn),比如geo是zset類型,hyperloglog和bitmaps都為string。
#?type命令,時(shí)間復(fù)雜度O(1) type?key
示例
>?set?test?test >?type?test string >?hset?htest?test?test >?type?htest hash
小結(jié)
上面介紹的是Redis中最常用的通用命令,雖然簡單,但還是非常有必要掌握其用法和使用方面要注意的事項(xiàng),其實(shí),對于普通開發(fā)人員來說,很多時(shí)候,也只是使用這些基礎(chǔ)通用的命令來操作Redis而已。
最后
歡迎大家一起交流,喜歡文章記得點(diǎn)個(gè)贊喲,感謝支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。