Redis的數據結構
Redis支持多種不同的數據結構,包括5種基礎數據結構和幾種比較複雜的數據,這些數據結構可以滿足不同的應用場景。
五種基礎數據結構
String:字符串,是構建其他數據結構的基礎
Hash:哈希列表
List:列表
Set:集合,在哈希列表的基礎上實現
Sort Set:有序集合
複雜的數據結構
Bitmaps:位圖,在string的基礎上進行位操作,可以實現節省空間的數據結構。
Hyperloglog:用於估計一個 set 中元素數量的概率性的數據結構。
Geo:geospatial,地理空間索引半徑查詢。
BloomFilter:布隆過濾器。
不同數據結構的相同之處
從上面的介紹,我們看到支持的數據結構的不同,但其實,Redis的每一種數據結構都由一個key和value組成,可以抽象爲:
而所有數據結構的key的值都是任意合法的字符串,不同的數據結構的區別就在於value存儲的值的不同而不同。
比如,最簡簡單的String數據結構,其value爲String,所以String可以表示爲:
而Hash數據結構,其value爲一個哈希列表,所以Hash可以表示爲:
這裏就列出String和Hash來講解說明,關於更多數據結構的內部結構及詳細操作,我們在之後的文章在再談談吧。
歡迎大家關注我的公種浩【程序員追風】,文章都會在裏面更新,整理的資料也會放在裏面。
Redis的通用命令
Redis官網將Redis的命令按照功能劃分爲15個主題分組,其中,Kyes主題的命令對所有的數據結構都通用,因此,有必要在瞭解其他數據結構命令前好好學習一下。
keys
keys命令的作用是列出Redis所有的key,該命令的時間複雜度爲O(N),N隨着Redis中key的數量增加而增加,因此Redis有大量的key,keys命令會執行很長時間,而由於Redis是單線程,某個命令耗費過長時間,則會導致後面的的所有請求無法得到響應,因此,千萬不要在生產服務器上使用keys命令。
# key命令,時間複雜度爲O(n) keys pattern #pattern可爲一個包含匹配模式的字符串,可以包含*,+,?,[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命令用於判斷一個或多個key是否存在,判斷多個key時,key之間用空格分隔,exists的返回值爲整數,表示當前判斷有多少個key是存在的。
# exists命令,時間複雜度O(1) exists key [key ...]
示例
> set test1 t1 > exists test1 test2 (integer) 1 #只有一個key存在 > exists test3 test3 (integer) 0 #key都不存在
del
del命令用於刪除一個或多個key,多個key之間用空格分隔,其返回值爲整數,表示成功刪除了多少個存在的key,因此,如果只刪除一個key,則可以從返回值中判斷是否成功,如果刪除多個key,則只能得到刪除成功的數量。
# del命令,時間複雜度O(n) del key [key ...]
示例
> set test t > del test (integer) 1 > mset test1 2 test2 1 > del test1 test2 test3 (integer) 2 # 返回2,表示成功刪除兩個 #再次刪除,返回0,因爲刪除成功個數爲0 > del test1 test2 test3 (integer) 0
expire,pexpire
expire設置key在多少秒之後過期,pexpire設置key在多少毫秒之後過期,成功返回1,失敗返回0。
# expire命令,時間複雜度爲O(1) expire key seconds # pexpire命令,時間複雜度爲O(1) pexpire key milliseconds
示例
> mset test test_value test1 test1_value > expire test 10 #設置10秒後過期 (integer) 1 > pexpire test1_value 10000 #設置10000毫秒(10s)後過期 (integer) 1 > expire ttt 100 (integer) 0 # 不存在的key,設置失敗,返回0
ttl,pttl
ttl和pttl命令用於獲取key的過期時間,其返回值爲整型,代表的意義分爲幾種情況:
當key不存在或過期時間,返回-2。
當key存在且永久有效時,返回-1。
當key有設置過期時間時,返回爲剩下的秒數(pttl爲毫秒數)
# ttl命令,時間複雜度O(1) ttl key # pttl命令,時間複雜度O(1) pttl key
示例(ttl的演示,pttl類似)
> set test test > expire test 100 > ttl test (integer) 98#返回剩下的秒數 > set test1 #永久有效 > ttl test1 (integer) -1 > ttl test2 (integer) -2#不存在或過期 #100秒後 > ttl test # test已過期 (integer) -2
expireat,pexpireat
設置key在某個時間戳過期,expreat參數時間戳用秒錶示,而pexpireat則用毫秒錶示,與expire和pexpire功能類似,返回1表示成功,0表示失敗。
#expireat命令,時間複雜度爲O(1) expireat key timestamp #pexpireat命令,時間複雜度爲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的過期時間,將key設置爲永久有效,當key設置了過期時間,使用persist命令移除後返回1,如果key不存在或本身就是永久有效的,則返回0。
# persist命令,時間複雜度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是什麼類型的數據結構,返回值爲string,list,set,hash,zset,分別表示我們前面介紹的Redis的5種基礎數據結構。
geo,hyperloglog,bitmaps等複雜的數據結構,都是在這五種基礎數據結構上實現,比如geo是zset類型,hyperloglog和bitmaps都爲string。
# type命令,時間複雜度O(1) type key
示例
> set test test > type test string > hset htest test test > type htest hash
小結
上面介紹的是Redis中最常用的通用命令,雖然簡單,但還是非常有必要掌握其用法和使用方面要注意的事項,其實,對於普通開發人員來說,很多時候,也只是使用這些基礎通用的命令來操作Redis而已。
最後
歡迎大家一起交流,喜歡文章記得點個贊喲,感謝支持!