雜湊類型(hash)相關操作
我們可以將Redis中的Hashes類型看成具有String Key和String Value的map容器。所以該類型非常適合於儲存值對象的資訊。
如Username、Password和Age等。如果Hash中包含很少的欄位,那麼該類型的資料也將僅佔用很少的磁碟空間。每一個Hash可
以儲存4294967295個索引值對。
hset/hget/hdel/hexists/hlen/hsetnx
#給索引值為myhash的鍵設定欄位為field1,值為stephen。redis 127.0.0.1:6379> hset myhash field1 "stephen"(integer) 1#擷取索引值為myhash,欄位為field1的值。redis 127.0.0.1:6379> hget myhash field1"stephen"#myhash鍵中不存在field2欄位,因此返回nil。redis 127.0.0.1:6379> hget myhash field2(nil)#給myhash關聯的Hashes值添加一個新的欄位field2,其值為liu。redis 127.0.0.1:6379> hset myhash field2 "liu"(integer) 1#擷取myhash鍵的欄位數量。redis 127.0.0.1:6379> hlen myhash(integer) 2#判斷myhash鍵中是否存在欄位名為field1的欄位,由於存在,傳回值為1。redis 127.0.0.1:6379> hexists myhash field1(integer) 1#刪除myhash鍵中欄位名為field1的欄位,刪除成功返回1。redis 127.0.0.1:6379> hdel myhash field1(integer) 1#再次刪除myhash鍵中欄位名為field1的欄位,由於上一條命令已經將其刪除,因為沒有刪除,返回0。redis 127.0.0.1:6379> hdel myhash field1(integer) 0#判斷myhash鍵中是否存在field1欄位,由於上一條命令已經將其刪除,因為返回0。redis 127.0.0.1:6379> hexists myhash field1(integer) 0#通過hsetnx命令給myhash添加新欄位field1,其值為stephen,因為該欄位已經被刪除,所以該命令添加成功並返回1。redis 127.0.0.1:6379> hsetnx myhash field1 stephen(integer) 1#由於myhash的field1欄位已經通過上一條命令添加成功,因為本條命令不做任何操作後返回0。redis 127.0.0.1:6379> hsetnx myhash field1 stephen(integer) 0
hgetall/hkeys/hvals/hmget/hmset
#刪除該鍵,便於後面樣本測試。redis 127.0.0.1:6379> del myhash(integer) 1#為該鍵myhash,一次性設定多個欄位,分別是field1 = "hello", field2 = "world"。redis 127.0.0.1:6379> hmset myhash field1 "hello" field2 "world"OK#擷取myhash鍵的多個欄位,其中field3並不存在,因為在返回結果中與該欄位對應的值為nil。redis 127.0.0.1:6379> hmget myhash field1 field2 field31) "hello"2) "world"3) (nil)#返回myhash鍵的所有欄位及其值,從結果中可以看出,他們是逐對列出的。redis 127.0.0.1:6379> hgetall myhash1) "field1"2) "hello"3) "field2"4) "world"#僅擷取myhash鍵中所有欄位的名字。redis 127.0.0.1:6379> hkeys myhash1) "field1"2) "field2"#僅擷取myhash鍵中所有欄位的值。redis 127.0.0.1:6379> hvals myhash1) "hello"2) "world"
hincrby
#刪除該鍵,便於後面樣本的測試。redis 127.0.0.1:6379> del myhash(integer) 1#準備測試資料,該myhash的field欄位設定值1。redis 127.0.0.1:6379> hset myhash field 5(integer) 1#給myhash的field欄位的值加1,返回加後的結果。redis 127.0.0.1:6379> hincrby myhash field 1(integer) 6#給myhash的field欄位的值加-1,返回加後的結果。redis 127.0.0.1:6379> hincrby myhash field -1(integer) 5#給myhash的field欄位的值加-10,返回加後的結果。redis 127.0.0.1:6379> hincrby myhash field -10(integer) -5
集合類型(set)相關操作
在Redis中,我們可以將Set類型看作為沒有排序的字元集合,和List類型一樣,我們也可以在該類型的資料值上執行添加、刪除或判斷某一元素是否存在等操作。需要說明的是,這些操作的時間複雜度為O(1),即常量時間內完成次操作。Set可包含的最大元素數量是2^32-1 (4294967295)。
和List類型不同的是,Set集合中不允許出現重複的元素,這一點和C++標準庫中的set容器是完全相同的。換句話說,如果多次添加相同元素,Set中將僅保留該元素的一份拷貝。和List類型相比,Set類型在功能上還存在著一個非常重要的特性,即在伺服器端完成多個Sets之間的彙總計算操作,
如unions、intersections和differences。由於這些操作均在服務端完成,因此效率極高,而且也節省了大量的網路IO開銷。
應用範圍: 可以使用Redis的Set資料類型跟蹤一些唯一性資料,比如訪問某一部落格的唯一IP地址資訊。對於此情境,我們僅需在每
次訪問該部落格時將訪問者的IP存入Redis中,Set資料類型會自動保證IP地址的唯一性。 充分利用Set類型的服務端彙總操作方便、高效的特性,可以用於維護資料對象之間的關聯關係。比如所有購買某一電子
裝置的客戶ID被儲存在一個指定的Set中,而購買另外一種電子產品的客戶ID被儲存在另外一個Set中,如果此時我們想
擷取有哪些客戶同時購買了這兩種商品時,Set的intersections命令就可以充分發揮它的方便和效率的優勢了。
sadd/smembers/scard/sismember
#插入測試資料,由於該鍵myset之前並不存在,因此參數中的三個成員都被正常插入。redis 127.0.0.1:6379> sadd myset a b c(integer) 3#由於參數中的a在myset中已經存在,因此本次操作僅僅插入了d和e兩個新成員。redis 127.0.0.1:6379> sadd myset a d e(integer) 2#判斷a是否已經存在,傳回值為1表示存在。redis 127.0.0.1:6379> sismember myset a(integer) 1#判斷f是否已經存在,傳回值為0表示不存在。redis 127.0.0.1:6379> sismember myset f(integer) 0#通過smembers命令查看插入的結果,從結果可以,輸出的順序和插入順序無關。redis 127.0.0.1:6379> smembers myset1) "c"2) "d"3) "a"4) "b"5) "e"#擷取Set集合中元素的數量。redis 127.0.0.1:6379> scard myset(integer) 5
spop/srem/srandmember/smove
#刪除該鍵,便於後面的測試。redis 127.0.0.1:6379> del myset(integer) 1#為後面的樣本準備測試資料。redis 127.0.0.1:6379> sadd myset a b c d(integer) 4#查看Set中成員的位置。redis 127.0.0.1:6379> smembers myset1) "c"2) "d"3) "a"4) "b"#從結果可以看出,該命令確實是隨機的返回了某一成員。redis 127.0.0.1:6379> srandmember myset"c"#Set中尾部的成員b被移出並返回,事實上b並不是之前插入的第一個或最後一個成員。redis 127.0.0.1:6379> spop myset"b"#查看移出後Set的成員資訊。redis 127.0.0.1:6379> smembers myset1) "c"2) "d"3) "a"#從Set中移出a、d和f三個成員,其中f並不存在,因此只有a和d兩個成員被移出,返回為2。redis 127.0.0.1:6379> srem myset a d f(integer) 2#查看移出後的輸出結果。redis 127.0.0.1:6379> smembers myset1) "c"
sdiff/sdiffstore/sinter/sinterstore/sunion/sunionstore
#為後面的smove命令準備資料。redis 127.0.0.1:6379> sadd myset a b(integer) 2redis 127.0.0.1:6379> sadd myset2 c d(integer) 2#將a從myset移到myset2,從結果可以看出移動成功。redis 127.0.0.1:6379> smove myset myset2 a(integer) 1#再次將a從myset移到myset2,由於此時a已經不是myset的成員了,因此移動失敗並返回0。redis 127.0.0.1:6379> smove myset myset2 a(integer) 0#分別查看myset和myset2的成員,確認移動是否真的成功。redis 127.0.0.1:6379> smembers myset1) "b"redis 127.0.0.1:6379> smembers myset21) "c"2) "d"3) "a"#為後面的命令準備測試資料。redis 127.0.0.1:6379> sadd myset a b c d(integer) 4redis 127.0.0.1:6379> sadd myset2 c(integer) 1redis 127.0.0.1:6379> sadd myset3 a c e(integer) 3#myset和myset2相比,a、b和d三個成員是兩者之間的差異成員。再用這個結果繼續和myset3進行差異比較,b和d是myset3不存在的成員。redis 127.0.0.1:6379> sdiff myset myset2 myset31) "d"2) "b"#將3個集合的差異成員儲存在diffkey關聯的Set中,並返回插入的成員數量。redis 127.0.0.1:6379> sdiffstore diffkey myset myset2 myset3(integer) 2#查看一下sdiffstore的操作結果。redis 127.0.0.1:6379> smembers diffkey1) "d"2) "b"#從之前準備的資料就可以看出,這三個Set的成員交集只有c。redis 127.0.0.1:6379> sinter myset myset2 myset31) "c"#將3個集合中的交整合員儲存到與interkey關聯的Set中,並返回交整合員的數量。redis 127.0.0.1:6379> sinterstore interkey myset myset2 myset3(integer) 1#查看一下sinterstore的操作結果。redis 127.0.0.1:6379> smembers interkey1) "c"#擷取3個集合中的成員的並集。 redis 127.0.0.1:6379> sunion myset myset2 myset31) "b"2) "c"3) "d"4) "e"5) "a"#將3個集合中成員的並集儲存到unionkey關聯的set中,並返回並整合員的數量。redis 127.0.0.1:6379> sunionstore unionkey myset myset2 myset3(integer) 5#查看一下suiionstore的操作結果。redis 127.0.0.1:6379> smembers unionkey1) "b"2) "c"3) "d"4) "e"5) "a"
有序集合類型(sorted set)相關操作
sorted-sets和Sets類型極為相似,它們都是字串的集合,都不允許重複的成員出現在一個Set中。它們之間的主要差別是sorted-sets
中的每一個成員都會有一個分數(score)與之關聯,Redis正是通過分數來為集合中的成員進行從小到大的排序。然而需要額外指出的是,
儘管sorted-sets中的成員必須是唯一的,但是分數(score)卻是可以重複的。
在sorted-set中添加、刪除或更新一個成員都是非常快速的操作,其時間複雜度為集合中成員數量的對數。由於sorted-sets中的成員在
集合中的位置是有序的,因此,即便是訪問位於集合中部的成員也仍然是非常高效的。事實上,Redis所具有的這一特徵在很多其它類型
的資料庫中是很難實現的,換句話說,在該點上要想達到和Redis同樣的高效,在其它資料庫中進行建模是非常困難的。
應用範圍: 可以用於一個大型線上遊戲的積分熱門排行榜。每當玩家的分數發生變化時,可以執行ZADD命令更新玩家的分數,此後再通過ZRANGE命令擷取積分TOP TEN的使用者資訊。當然我們也可以利用ZRANK命令通過username來擷取玩家的排行資訊。最後我們將組合使用ZRANGE和ZRANK命令快速的擷取和某個玩家積分相近的其他使用者的資訊。 Sorted-Sets類型還可用於構建索引資料。
zadd/zcard/zcount/zrem/zincrby/zscore/zrange/zrank:
#添加一個分數為1的成員。redis 127.0.0.1:6379> zadd myzset 1 "one"(integer) 1#添加兩個分數分別是2和3的兩個成員。redis 127.0.0.1:6379> zadd myzset 2 "two" 3 "three"(integer) 2#0表示第一個成員,-1表示最後一個成員。WITHSCORES選項表示返回的結果中包含每個成員及其分數,否則只返回成員。redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES1) "one"2) "1"3) "two"4) "2"5) "three"6) "3"#擷取成員one在Sorted-Set中的位置索引值。0表示第一個位置。redis 127.0.0.1:6379> zrank myzset one(integer) 0#成員four並不存在,因此返回nil。redis 127.0.0.1:6379> zrank myzset four(nil)#擷取myzset鍵中成員的數量。 redis 127.0.0.1:6379> zcard myzset(integer) 3#返回與myzset關聯的Sorted-Set中,分數滿足運算式1 <= score <= 2的成員的數量。redis 127.0.0.1:6379> zcount myzset 1 2(integer) 2#刪除成員one和two,返回實際刪除成員的數量。redis 127.0.0.1:6379> zrem myzset one two(integer) 2#查看是否刪除成功。redis 127.0.0.1:6379> zcard myzset(integer) 1#擷取成員three的分數。傳回值是字串形式。redis 127.0.0.1:6379> zscore myzset three"3"#由於成員two已經被刪除,所以該命令返回nil。redis 127.0.0.1:6379> zscore myzset two(nil)#將成員one的分數增加2,並返回該成員更新後的分數(沒有該成員則建立)。redis 127.0.0.1:6379> zincrby myzset 2 one"3"#將成員one的分數增加-1,並返回該成員更新後的分數。redis 127.0.0.1:6379> zincrby myzset -1 one"2"#查看在更新了成員的分數後是否正確。redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES1) "one"2) "2"3) "two"4) "2"5) "three"6) "3"
zrangebyscore/zremrangebyrank/zremrangebyscore
redis 127.0.0.1:6379> del myzset(integer) 1redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four(integer) 4#擷取分數滿足運算式1 <= score <= 2的成員。redis 127.0.0.1:6379> zrangebyscore myzset 1 21) "one"2) "two"#擷取分數滿足運算式1 < score <= 2的成員。redis 127.0.0.1:6379> zrangebyscore myzset (1 21) "two"#-inf表示第一個成員,+inf表示最後一個成員,limit後面的參數用於限制返回成員的自己,#2表示從位置索引(0-based)等於2的成員開始,取後面3個成員。redis 127.0.0.1:6379> zrangebyscore myzset -inf +inf limit 2 31) "three"2) "four"#刪除分數滿足運算式1 <= score <= 2的成員,並返回實際刪除的數量。redis 127.0.0.1:6379> zremrangebyscore myzset 1 2(integer) 2#看出一下上面的刪除是否成功。redis 127.0.0.1:6379> zrange myzset 0 -11) "three"2) "four"#刪除位元置索引滿足運算式0 <= rank <= 1的成員。redis 127.0.0.1:6379> zremrangebyrank myzset 0 1(integer) 2#查看上一條命令是否刪除成功。redis 127.0.0.1:6379> zcard myzset(integer) 0
zrevrange/zrevrangebyscore/zrevrank:
#為後面的樣本準備測試資料。redis 127.0.0.1:6379> del myzset(integer) 0redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four(integer) 4#以位置索引從高到低的方式擷取並返回此區間內的成員。redis 127.0.0.1:6379> zrevrange myzset 0 -1 WITHSCORES1) "four"2) "4"3) "three"4) "3"5) "two"6) "2"7) "one"8) "1"#由於是從高到低的排序,所以位置等於0的是four,1是three,並以此類推。redis 127.0.0.1:6379> zrevrange myzset 1 31) "three"2) "two"3) "one"#由於是從高到低的排序,所以one的位置是3。redis 127.0.0.1:6379> zrevrank myzset one(integer) 3#由於是從高到低的排序,所以four的位置是0。redis 127.0.0.1:6379> zrevrank myzset four(integer) 0#擷取分數滿足運算式3 >= score >= 0的成員,並以相反的順序輸出,即從高到底的順序。redis 127.0.0.1:6379> zrevrangebyscore myzset 3