標籤:server 二進位 儲存空間 圖片 字串
Redis資料類型實驗簡介
Redis不僅僅是簡單的key-value 儲存空間,同時也是一種data structures server。傳統的key-value是指支援使用一個key字串來索引value字串的儲存,而Redis中,value不僅僅支援字串,還支援更多的複雜結構,包括列表,集合,雜湊表等。現在我們一一講解:Redis keys是採用二進位安全,這就意味著你可以使用任何二進位序列作為重點,從像"foo"可以聯絡一個 JPEG 檔案。Null 字元串也是一個有效密鑰。
一、Redis strings
字串是一種最基本的Redis實值型別。Redis字串是二進位安全的,這意味著一個Redis字串能包含任意類型的資料,例如: 一張JPEG格式的圖片或者一個序列化的Ruby對象。一個字串類型的值最多能儲存512M位元組的內容。
我們繼續上一個實驗,啟動redis-cli來看看Redis strings資料類型。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/70/14/wKiom1WwwkiQZzorAAE7SJc3Blw961.jpg" title="1.png" alt="wKiom1WwwkiQZzorAAE7SJc3Blw961.jpg" />650) this.width=650;" width="32" height="32" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/themes/default/images/word.gif") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
如上例所示,可以SET和GET命令來建立和檢索strings。注意,set命令將取代現有的任何已經存在的key。SET命令還有一個提供附加參數的選項,我們能夠讓SET命令只有在沒有相同key的情況下成功,反之亦然,可以讓SET命令在有相同key值得情況下成功。
即使string是Redis的基本類型,也可以對其進行一些有趣的操作,例如加法器:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/70/14/wKiom1Wwwn2CoYqhAAIspjhewS0417.jpg" title="2.png" alt="wKiom1Wwwn2CoYqhAAIspjhewS0417.jpg" />
INCR命令讓the value 成為一個整數,運行一次INCR便+1。INCRBY命令便是一個加法運算。類似的命令如減法運算為: DECR and DECRBY。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/70/11/wKioL1WwxG7jlQaJAAHonfEHgEs700.jpg" title="3.png" alt="wKioL1WwxG7jlQaJAAHonfEHgEs700.jpg" />
Redis可以運用MSET and MGET 命令完成一次性的完成多個key-value的對應關係,使用MGET命令,Redis返回一個value數組。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/70/14/wKiom1WwwpXChGhpAAEEl48aqyk120.jpg" title="4.png" alt="wKiom1WwwpXChGhpAAEEl48aqyk120.jpg" />
二、Redis Lists
Redis列表是簡單的字串列表,按照插入順序排序。你可以添加一個元素導列表的頭部(左邊)或者尾部(右邊) LPUSH 命令插入一個新的元素導頭部, 而 RPUSH插入一個新元素導尾部.當一個這兩個操作在一個空的Key上被執行的時候一個新的列表被建立。相似的,如果一個列表操作清空一個列表那麼對應的key將被從key空間刪除。這是非常方便的語義,因為他們被調用使用一個空列表完全就像他們被調用時使用一個不存在的索引值(可以)做為參數。
PUSH一類的命令的傳回值為list的長度。一些類表操作和結果的例子:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/70/11/wKioL1WwxIWBI-SbAAHeKx0z3l8675.jpg" title="5.png" alt="wKioL1WwxIWBI-SbAAHeKx0z3l8675.jpg" />
注意:LRANGE 利用了兩個檢索值,0表示list的開頭第一個,-1表示list的倒數第一個,即最後一個。-2則便是list的倒數第二個,以此類推。
這些命令都是可變的命令,也就是說你可以一次加入多個元素放入list。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/70/14/wKiom1WwwqqQfw2TAAFlq-ivTNA988.jpg" title="6.png" width="600" height="254" border="0" hspace="0" vspace="0" style="width:600px;height:254px;" alt="wKiom1WwwqqQfw2TAAFlq-ivTNA988.jpg" />
在Redis的命令操作中,還有一類重要的操作:POP,取出list元素。和PUSH操作類似,POP命令可以選擇不同的方向取出元素.POP命令傳回值為取出的元素。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/70/11/wKioL1WwxJmxWDGxAANnM2S2NhE360.jpg" title="7.png" width="415" height="500" border="0" hspace="0" vspace="0" style="width:415px;height:500px;" alt="wKioL1WwxJmxWDGxAANnM2S2NhE360.jpg" />
在Redis list中還有很多有用的命令,此處限於篇幅便不在贅述。
三、Redis Hashes
Redis Hashes是字串欄位和字串值之間的映射,因此他們是展現對象的完美資料類型。 (例如:一個有名,姓,年齡等等屬性的使用者):一個帶有一些欄位的hash僅僅需要一塊很小的空間儲存,因此你可以儲存數以百萬計的對象在一個小的Redis執行個體中。 雜湊主要用來表現對象,他們有能力儲存很多個物件,因此你可以將雜湊用於許多其他的任務。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/70/14/wKiom1WwwsHDVKiDAANoOXtjCU8738.jpg" title="8.png" width="700" height="320" border="0" hspace="0" vspace="0" style="width:700px;height:320px;" alt="wKiom1WwwsHDVKiDAANoOXtjCU8738.jpg" />
HMSET命令設定一個多域的hash表,HGET命令擷取指定的單域,HGETALL命令擷取指定key的所有資訊。HMGET類似於HGET,只是返回一個value數組。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/70/14/wKiom1WwwszR3mVhAAGpmZTJFRY036.jpg" title="9.png" width="700" height="184" border="0" hspace="0" vspace="0" style="width:700px;height:184px;" alt="wKiom1WwwszR3mVhAAGpmZTJFRY036.jpg" />
同樣可以根據需要對hash表的表項進行單獨的操作,例如 HINCRBY, (原本birthyear 為1977,見上一圖)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/70/11/wKioL1WwxMLRpZDaAAFbhEZZcFw578.jpg" title="10.png" alt="wKioL1WwxMLRpZDaAAFbhEZZcFw578.jpg" />
四、Redis 無序集合
Redis 集合(Set)是一個無序的字串集合. 你可以以O(1)的時間複雜度 (無論集合中有多少元素時間複雜度都是常量)完成添加,刪除,以及測試元素是否存在。 Redis 集合擁有令人滿意的不允許包含相同成員的屬性。多次添加相同的元素,最終在集合裡只會有一個元素。 實際上說這些就是意味著在添加元素的時候無須檢測元素是否存在。 一個Redis集合的非常有趣的事情是他支援一些服務端的命令從現有的集合出發去進行集合運算,因此你可以在非常短的時間內進行合并(unions), 求交集(intersections),找出不同的元素(differences of sets)。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/70/11/wKioL1WwxS6jtX7OAAIFkK69tVA094.jpg" title="11.png" width="700" height="176" border="0" hspace="0" vspace="0" style="width:700px;height:176px;" alt="wKioL1WwxS6jtX7OAAIFkK69tVA094.jpg" />
SISMEMBER用於查看集合是否存在,匹配項包括集合名和元素個數。匹配成功返回1,匹配失敗返回0.
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/70/11/wKioL1WwxTiTPqSsAAFmsk3l4Ak870.jpg" title="12.png" alt="wKioL1WwxTiTPqSsAAFmsk3l4Ak870.jpg" />
五、Redis有序集合
Redis有序集合與普通集合非常相似,是一個沒有重複元素的字串集合。不同之處是有序集合的沒有成員都關聯了一個評分,這個評分被用來按照從最低分到最高分的方式排序集合中的成員。集合的成員是唯一的,但是評分可以是重複了。 使用有序集合你可以以非常快的速度(O(log(N)))添加,刪除和更新元素。因為元素是有序的, 所以你也可以很快的根據評分(score)或者次序(position)來擷取一個範圍的元素。訪問有序集合的中間元素也是非常快的,因此你能夠使用有序集合作為一個沒有重複成員的智能列表。在有序集合中,你可以很快捷的訪問一切你需要的東西:有序的元素,快速的存在性測試,快速存取集合的中間元素! 簡而言之使用有序集合你可以做完成許多對效能有極端要求的任務,而那些任務使用其他類型的資料庫真的是很難完成的。
ZADD與SADD類似,但是在元素之前多了一個參數,這個參數便是用於排序的。形成一個有序的集合。
查看集合ZRANGE是查看正序的集合,ZREVRANGE是查看反序的集合。0表示集合第一個元素,-1表示集合的倒數第一個元素。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/70/14/wKiom1Www1yg-_mQAAS-YoQrVUY588.jpg" title="13.png" width="600" height="480" border="0" hspace="0" vspace="0" style="width:600px;height:480px;" alt="wKiom1Www1yg-_mQAAS-YoQrVUY588.jpg" />
參考文檔
http://redis.io/topics/data-types-intro
http://www.cnblogs.com/guanjinke/archive/2013/01/21/2870576.html
http://www.linuxidc.com/Linux/2014-05/101544p2.htm
redis資料類型