Redis提供了5種數據結構,如下介紹一些預備知識以及Redis的5種數據結構java
Redis的5種數據結構,它們是鍵值對中的值,對於鍵來說有一些通用的命令。python
1 keys *
1 dbsize
dbsize會返回當前數據庫中鍵的總和,例如當前數據庫中有4個鍵即hello java python mylist,因此測試結果爲4。注意,dbsize在計算鍵總數時不會遍歷全部的鍵,而是直接獲取數據庫
Redis內置的鍵總和的變量,因此此命令的時間複雜度爲O(1)。然而命令keys *會遍歷全部的鍵,因此它的時間複雜度爲O(n)。當Redis保存了大量的鍵時,線上環境禁止使用命令keys * 。json
1 exists key
若是鍵存在則返回1,不存在則返回0。緩存
1 del key [key1 ...]
del是一個通用命令,不管鍵值是何種數據結構,del命令均可以將其刪除,例如刪除鍵值類型爲字符串類型的java以及類型爲列表類型的mylist。網絡
返回結果爲成功刪除鍵的個數,假設刪除一個不存在的鍵,就會返回0。同時del命令支持同時刪除多個鍵。數據結構
1 expire key seconds
Redis支持對鍵添加過時時間,當超過過時時間後,將會自動刪除鍵,例如爲鍵hello設置了10秒的過時時間。app
這裏的ttl命令會返回鍵的剩餘過時時間,它有3種返回值:分佈式
1 type key
例如鍵hello是字符串類型,返回結果爲string。鍵mylist是列表類型,返回結果爲list。若是鍵不存在,則返回none學習
在終端可使用object encoding命令查詢內部編碼。
字符串類型是Redis最基礎的數據結構,首先鍵都是字符串類型,而其餘幾種數據結構都是在字符串類型的基礎上構建的,因此字符串類型能爲其它4種數據結構的學習奠基基礎。字符串的類型可使字符串(簡單字符串、複雜字符串(例如json以及XML))、數字(整型、浮點數)、二進制(圖片、音視頻)。可是佔用的空間最大不能超過512M。
1 set key value [ex seconds] [px milliseconds] [nx|xx]
上述命令的經常使用選項:
除了set選項,Redis還提供了setex和setnx兩個命令,他們的做用與ex和nx選項是同樣的。
1 setex key seconds value 2 setnx key value
setnx和setxx在實際的場景有何應用呢?以setnx命令爲例,因爲Redis的單線程命令處理機制,若是有多個客戶端同時執行setnx key value,根據setnx的特性,只有一個客戶端能設置成功,setnx能夠做爲分佈式鎖的一種實現方案。
1 get key
若是要獲取的值不存在,則返回nil(空)
1 mset key value [key value ...]
1 mget key [key ...]
若是有些鍵不存在,則它的值爲nil(空),結果是按照傳入鍵的順序返回的:
關於使用n次get獲取n條結果與使用1次mget獲取n條結果的比較:
使用get命令:n次get時間 = n次網絡時間+n次命令時間
使用mget命令:n次get時間 = 1次網絡時間+n次命令時間
學會使用批量操做,有助於提升業務處理效率,可是要注意的是每次批量操做所發送的命令數不是無節制的,若是數量過多可能會形成Redis擁塞或者網絡擁塞,此時能夠用屢次的批量操完成。
1 incr key
incr命令用於對值作自增操做,返回的結果分爲3種狀況:
除了incr命令,Redis還提供了decr(自減)、incrby(自增指定數字)、decrby(自減指定數字)、incrbyfloat(自增浮點數)。
1 append key value
append能夠向字符串尾部追加值。
1 strlen key
須要注意的是中文佔兩個字節。命令返回的是當前value所佔的字節數。
1 getset key value
getset和set同樣會設置值,可是不一樣的是,它同時會返回原來的值。
1 setrange key offeset value
1 getrange key start end
start和end分別是開始和結束的偏移量,偏移量是從0開始計算。例以下述操做獲取了值bast的前兩個字符。
下表是字符串類型命令的時間複雜度。
字符串類型的內部編碼有3種:
Redis會根據當前值的類型和長度來決定使用哪一種內部編碼實現。