第三章 入門
本章詳細介紹Redis的5種主要數據類型及相應的命令
3.1 簡單操作介紹
-
獲得符合規則的鍵名列表
keys pattern
其中,pattern支持glob風格通配符格式符 號 含義 ? 匹配一個字符 * 匹配任意個(包括0個)字符 [ ] 匹配括號間的任一字符,可以使用“-”符號表示一個範圍, 如a[b-d]可以匹配“ab”、“ac”和“ad” \x 匹配字符x,用於轉義符號、如要匹配"?"就需要使用? 正則表達式與glob風格模式的區別 http://www.voidcn.com/article/p-gmjhucid-btq.html
-
判斷一個鍵是否存在
EXISTS key
如果存在鍵就返回整數類型1,否則返回0 -
刪除鍵
DEL key [key...]
可以刪除一個或多個鍵,返回刪除的鍵的個數 -
獲得鍵值的數據類型
TYPE key
用來獲得鍵值的數據類型,返回值可能是string、hash、list、set、zset(有序集合)
上面簡單操作見如圖所示:
3.2 字符串類型
3.2.1 介紹
字符串類型是Redis中最基本的數據類型,它能存儲任何形式的字符串,包括二進制數據。可以用其存儲用戶的郵箱、JSON化的對象甚至是一張圖片。一個字符串類型鍵允許存儲的數據的最大容量是512MB
**字符串類型是其他4中數據類型的基礎,其他數據類型和字符串類型的差別從某種角度來說只是組織字符串的形式不同。**例如,列表類型是以列表的形式組織字符串,而集合類型是以集合的形式組織字符串
3.2.2 命令
- 賦值與取值
SET key value
GET key
-
遞增數字
INCE key
作用是讓當前鍵值遞增,並返回遞增後的值
3.2.3 實踐
Pass~~實踐是檢驗真理的唯一標準
3.2.4 命令拾遺
-
增加指定的整數
INCRBY key increment
指定通過inrement參數指定一次增加的數值 -
減少指定的整數
DECR key
、DECRBY key decrement
與INCRBT用法相同,只不過是讓簡直遞減 -
增加指定浮點數
INCRBYFLOAT key increment
可以遞增一個雙精度浮點數 -
向尾部追加值
APPEND key value
-
獲取字符串長度
STRLEN key
-
同時獲取/設置多個鍵值
MGET key [key...]
、MGET key value[key value...]
同時獲得/設置多個鍵值 -
位操作
曾聽到過的一句經典名言:“世界上有一個偉大的東西叫百度,百度能教會你許多,學會百度是一種能力與技巧”
上述命令見如圖所示:
3.3 散列類型
3.3.1 介紹
散列類型的鍵值也是一種字典結構,其存儲了字段和字段值的映射,但字段值只能是字符串,不支持其他數據類型。換言之,散列類型不能嵌套其他的數據類型
提示:除了散列類型,Redis的其他數據類型同樣不支持數據類型嵌套。比如集合類型的每個元素都只能是字符串,不能是另一個集合或散列表等
對象的存儲結構只是人爲的約定,Redis並不要求每個鍵都依據此結構存儲,我們完全可以自由地爲任何鍵增減字段而不影響其他鍵
3.3.2 命令
-
賦值與取值
-
HSET命令用來給字段賦值,而HGET命令用來獲得字段值
-
當需要同時設置多個字段的值時,使用HMSET命令。相應地,HMGET命令可以同時獲得多個字段的值
-
使用HGETALL獲取鍵中所有字段和字段值。返回的結果是字段和字段值組成的列表,這樣的結果並不直觀,大多數Redis客戶端會將HGETALL返回的結果封裝成一個對象
-
-
判斷字段是否存在
HEISTS key field
用來判斷一個字段是否存在 -
當字段不存在時賦值
HSETNX key field value
功能與HSET命令類似,區別在於如果字段已經存在,HSETNX命令將不執行任何操作 -
增加數字
HINCRBT key field increment
可以是字段值增加指定的整數 -
刪除字段
HDEL key field [field...]
可以刪除一個或多個字段
3.3.3 實踐
Pass~~實踐是檢驗真理的唯一標準
3.3.4 命令拾遺
-
只獲取字段名或字段值
HKEYS key
用來獲取鍵中所有字段的名字與之對應HVALS key
用來獲得鍵中所有字段值 -
獲得字段數量
HLEN key
3.4 列表類型
3.4.1 介紹
列表類型可以存儲一個有序的字符串列表。常用的操作是向列表兩端添加元素或者獲得列表的某一個片段
列表類型內部是使用雙向鏈表實現的,所以向列表兩端添加元素的時間複雜度爲O(1),獲取越接近兩端的元素速度就越快。不過使用鏈表的代價是通過索引訪問元素比較慢
這種數據類型是可以滿足某些特定場景的,比起關係數據庫會非常快速的完成
3.4.2 命令
-
向列表兩端增加元素
LPUSH key value [value ...]
用來向列表左邊增加元素,返回值表示增加元素後列表的長度RPUSH key value [value ...]
用來向列表右邊增加元素,返回值表示增加元素後列表的長度 -
從列表兩端彈出元素
LPOP key
從列表左邊移出一個元素,並返回被移除的元素值RPOP key
從列表右邊移出一個元素,並返回被移除的元素值 -
獲取列表中元素的個數
LLEN key
獲取列表中元素的個數值得注意的是LLEN的時間複雜度是O(1),使用時Redis會直接讀取現成的值,而不需要像關係數據庫遍歷
-
獲得列表片段
LRANGE key start stop
獲取列表中的某一片段,返回索引是從start到stop之間的所有元素(包含雙端元素)LRANGE還支持負索引,表示從右邊開始計算序數,如“-3”表示從最右邊第三個元素
一些特殊情況:
- 如果start的索引位置比stop的索引位置靠後,則會返回空列表
- 如果stop大於實際的索引範圍,則會返回到列表最右邊的元素
-
刪除列表中指定的值
LREM key count value
刪除列表中前count個值爲value的元素,返回值是實際刪除的元素個數。根據count值的不同,LREM執行的方式也不同:count取值 執行方式 count>0 LREM命令會從列表左邊開始刪除前count個值爲value的元素 count<0 LREM命令會從列表右邊開始刪除前count個值爲value的元素 count=0 LREM命令會刪除所有值爲value的元素
3.4.3 實踐
Pass~~實踐是檢驗真理的唯一標準
3.4.4 命令拾遺
-
獲得/設置指定索引的元素值
LINDEX key index
返回指定索引的元素,索引從0開始。索引也可以是負數LSET key index value
通過索引操作列表,它會將索引爲index的元素賦值爲value -
只保留列表指定片段
LTRIM key start end
可以刪除指定索引範圍之外的所有元素,其指定列表範圍的方法與上述LRANGE相同 -
向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
會在列表中從左到右查找值爲pivot的元素,然後根據第二個參數是BEFORE還是AFTER來決定將value插入到該元素的前面還是後面 -
將元素從一個列表轉到另一個列表
RPOPLPUSH source destination
先執行RPOP命令再執行LPUSH命令,會先從source列表類型鍵的右邊彈出一個元素,然後加入到destination列表類型鍵的左邊,並返回這個元素的值
3.5 集合類型
3.5.1 介紹
3.5.2 命令
-
增加/刪除元素
SADD key member [member ...]
用來向集合中增加一個或多個元素SREM key member [member ...]
用來從集合中刪除一個或多個元素 -
獲得集合中的所有元素
SMEMBERS key
用來返回集合中的所有元素 -
判斷元素是否在集合中
SISMEMBER key member
判斷一個元素是否在集合中,無論集合中有多少個,都可以極快地返回結果
-
集合間運算
命 令 功 能 SDIFF key [key ...]
用來對多個集合執行差集運算 SINTER key[key ...]
用來對多個集合執行交集運算 SUNION key [key ...]
用來對多個集合執行並集運算
3.5.3 實踐
Pass~~實踐是檢驗真理的唯一標準
3.5.4 命令拾遺
-
獲得集合中元素個數
SCARD key
用來獲得集合中的元素個數 -
進行集合運算並將結果存儲
SDIFFSTORE destination key [key ...]
用來存儲差集結果到另一個集合。同時,另外兩個運算也與之相同SINTERSTORE和SUNIONSTORE -
隨機獲得集合中的元素
SRANDMEMBER key [count]
用來隨機從集合中獲取一個元素,count參數見下表:count參數取值 SRANDMEMBER表現 正數 隨機從集合中獲得count個不重複的元素 負數 隨機從集合中獲得abs(count)個元素,元素可能相同 集合類型採用的存儲結構是散列表造成的,散列函數將元素映射到不同的存儲位置上以實現O(1)時間複雜度的元素查找。當兩個不同的元素的散列值相同時會出現衝突,即用拉練法來解決這個衝突,散列值衝突的元素以鏈表形式存入
查找元素時先找到對應的散列值,然後再從這個散列值中的鏈表中隨機抽取一個元素。所以說鏈表越短,被隨機抽取的概率就越大。見下面原理圖可知:
-
從集合中彈出一個元素
SPOP key
隨機選擇一個元素彈出
3.6 有序集合類型
3.6.1 介紹
在集合類型的基礎上爲集合中每一個元素都關聯了一個分數。有序集合中每個元素是不相同的,但是分數是可以相同的
有序集合類型是使用散列表和跳錶實現的,讀取任何一個位置的數據速度很快,時間複雜度是O(log(N))
什麼是跳錶呢?
跳錶是一種隨機化的數據結構,目前開源軟件 Redis 和 LevelDB 都有用到它,它的效率和紅黑樹以及 AVL 樹不相上下,但跳錶的原理相當簡單,只要你能熟練操作鏈表,就能輕鬆實現一個 SkipList。
定義
如果你要在一個有序的序列中查找元素 k ,相信大多數人第一反應都是二分查找。
如果你需要維護一個支持插入操作的有序表,大家又會想到鏈表。
簡單的說,要達到以logn的速度查找鏈表中的元素
3.6.2 命令
-
增加元素
ZADD key score member [score member ...]
用來在有序集合中加入一個元素和該元素的分數,該分數可以是整數也可以是雙精度浮點數+inf和-inf分別表示正無窮和負無窮
-
獲得元素的分數
ZSCORE key member
-
獲得排名在某個範圍的元素列表
ZRANGE key start stop [WITHSCORES]
按照元素分數從小到大的順序返回索引從start到stop之間的所有元素(包含兩端),加上WITHSCORES參數,會改變返回的數據格式ZREVRANGE key start stop [WITHSCORES]
與ZRANGE唯一不同就是從大到小的順序 -
獲得指定分數範圍的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
按照元素分數從小到大的順序返回分數在min和max之間(包含min、max)的元素,如果分數範圍不包含端點值,可以在分數前加"("。LIMIT offset count參數表示獲得元素列表的基礎上向後偏移offset個元素,並且只獲取前count個元素 -
增加某個元素的分數
INCRBY key increment member
可以增加一個元素的分數,返回值是更改後的分數。也可以減少,用負數表示
3.6.3 實踐
Pass~~實踐是檢驗真理的唯一標準
3.6.4 命令拾遺
-
獲得集合中元素的數量
ZCARD key
-
獲得指定分數範圍內的元素個數
ZCOUNT key min max
參數特性與前面一樣 -
刪除一個或多個元素
ZREM key member [member ...]
-
按照排名範圍刪除元素
ZREMRANGERBYRANK key start stop
按照元素分數從小到大的順序(索引0表示最小的值)刪除在指定排名範圍內的所有元素 -
按照分數範圍刪除元素
ZREMRANGEBYSCORE key min max
刪除指定分數範圍內的所有元素 -
獲得元素的排名
ZRANK key member
按照元素分數從小到大的順序獲得指定的元素的排名(從0開始)
-
計算有序集合的交集
ZINTERSTORE destination numkeys key [keys ...] [weights weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
用來計算多個有序集合的交集並將結果存儲在destination中。其中,destination鍵中元素的分數是由AGGREGATE參數決定的:- SUM是每個參與計算的集合中該元素分數的和
- MIN是每個參與計算的集合中該元素分數的最小值
- MAX是每個參與計算的集合中該元素分數的最大值
還能夠通過WEIGHTS 參數設置每個集合的權值,每個集合在參與計算時元素的分數會被乘上該集合的權重
當然,與之對應的ZUNIONSTORE計算有序集合的並集用法語法都一樣