Redis常用資料型別介紹、使用場景及其操作命令
Redis目前支援5種資料型別,分別是:
- String(字串)
- List(列表)
- Hash(字典)
- Set(集合)
- Sorted Set(有序集合)
下面就分別介紹這五種資料型別及其相應的操作命令。
1. String(字串)
String是簡單的 key-value 鍵值對,value 不僅可以是 String,也可以是數字。String在redis內部儲存預設就是一個字串,被redisObject所引用,當遇到incr,decr等操作時會轉成數值型進行計算,此時redisObject的encoding欄位為int。
String在redis內部儲存預設就是一個字串,被redisObject所引用,當遇到incr,decr等操作時會轉成數值型進行計算,此時redisObject的encoding欄位為int。
應用場景
String是最常用的一種資料型別,普通的key/value儲存都可以歸為此類,這裡就不所做解釋了。
相關命令
SET key value 設定key=value GET key 或者鍵key對應的值 GETRANGE key start end 得到字串的子字串存放在一個鍵 GETSET key value 設定鍵的字串值,並返回舊值 GETBIT key offset 返回儲存在鍵位值的字串值的偏移 MGET key1 [key2..] 得到所有的給定鍵的值 SETBIT key offset value 設定或清除該位在儲存在鍵的字串值偏移 SETEX key seconds value 鍵到期時設定值 SETNX key value 設定鍵的值,只有當該鍵不存在 SETRANGE key offset value 覆蓋字串的一部分從指定鍵的偏移 STRLEN key 得到儲存在鍵的值的長度 MSET key value [key value...] 設定多個鍵和多個值 MSETNX key value [key value...] 設定多個鍵多個值,只有在當沒有按鍵的存在時 PSETEX key milliseconds value 設定鍵的毫秒值和到期時間 INCR key 增加鍵的整數值一次 INCRBY key increment 由給定的數量遞增鍵的整數值 INCRBYFLOAT key increment 由給定的數量遞增鍵的浮點值 DECR key 遞減鍵一次的整數值 DECRBY key decrement 由給定數目遞減鍵的整數值 APPEND key value 追加值到一個鍵
其中用於操作管理鍵的命令有:
DEL key 如果存在刪除鍵 DUMP key 返回儲存在指定鍵的值的序列化版本 EXISTS key 此命令檢查該鍵是否存在 EXPIRE key seconds 指定鍵的過期時間 EXPIREAT key timestamp 指定的鍵過期時間。在這裡,時間是在Unix時間戳格式 PEXPIRE key milliseconds 設定鍵以毫秒為單位到期 PEXPIREAT key milliseconds-timestamp 設定鍵在Unix時間戳指定為毫秒到期 KEYS pattern 查詢與指定模式匹配的所有鍵 MOVE key db 移動鍵到另一個數據庫 PERSIST key 移除過期的鍵 PTTL key 以毫秒為單位獲取剩餘時間的到期鍵。 TTL key 獲取鍵到期的剩餘時間。 RANDOMKEY 從Redis返回隨機鍵 RENAME key newkey 更改鍵的名稱 RENAMENX key newkey 重新命名鍵,如果新的鍵不存在 TYPE key 返回儲存在鍵的資料型別的值。
使用示例
redis 127.0.0.1:6379> set baidu http://www.baidu
OK
redis 127.0.0.1:6379> append baidu .com
(integer) 20
redis 127.0.0.1:6379> get baidu
"http://www.baidu.com"
redis 127.0.0.1:6379> set visitors 0
OK
redis 127.0.0.1:6379> incr visitors
(integer) 1
redis 127.0.0.1:6379> incr visitors
(integer) 2
redis 127.0.0.1:6379> get visitors
"2"
redis 127.0.0.1:6379> incrby visitors 100
(integer) 102
redis 127.0.0.1:6379> get visitors
"102"
redis 127.0.0.1:6379> type baidu
string
redis 127.0.0.1:6379> type visitors
string
redis 127.0.0.1:6379> ttl baidu
(integer) -1
redis 127.0.0.1:6379> rename baidu baidu-site
OK
redis 127.0.0.1:6379> get baidu
(nil)
redis 127.0.0.1:6379> get baidu-site
"http://www.baidu.com"
2. List(列表)
Redis列表是簡單的字串列表,可以類比到C++中的std::list,簡單的說就是一個連結串列或者說是一個佇列。可以從頭部或尾部向Redis列表新增元素。列表的最大長度為2^32 - 1,也即每個列表支援超過40億個元素。
Redis list的實現為一個雙向連結串列,即可以支援反向查詢和遍歷,更方便操作,不過帶來了部分額外的記憶體開銷,Redis內部的很多實現,包括髮送緩衝佇列等也都是用的這個資料結構。
應用場景
Redis list的應用場景非常多,也是Redis最重要的資料結構之一,比如twitter的關注列表、粉絲列表等都可以用Redis的list結構來實現,再比如有的應用使用Redis的list型別實現一個簡單的輕量級訊息佇列,生產者push,消費者pop/bpop。
相關命令
- BLPOP
BLPOP key1 [key2 ] timeout 取出並獲取列表中的第一個元素,或阻塞,直到有可用 - BRPOP
BRPOP key1 [key2 ] timeout 取出並獲取列表中的最後一個元素,或阻塞,直到有可用 - BRPOPLPUSH
BRPOPLPUSH source destination timeout 從列表中彈出一個值,它推到另一個列表並返回它;或阻塞,直到有可用 - LINDEX
LINDEX key index 從一個列表其索引獲取對應的元素 - LINSERT
LINSERT key BEFORE|AFTER pivot value 在列表中的其他元素之後或之前插入一個元素 - LLEN
LLEN key 獲取列表的長度 - LPOP
LPOP key 獲取並取出列表中的第一個元素 - LPUSH
LPUSH key value1 [value2] 在前面加上一個或多個值的列表 - LPUSHX
LPUSHX key value 在前面加上一個值列表,僅當列表中存在 - LRANGE
LRANGE key start stop 從一個列表獲取各種元素 - LREM
LREM key count value 從列表中刪除元素 - LSET
LSET key index value 在列表中的索引設定一個元素的值 - LTRIM
LTRIM key start stop 修剪列表到指定的範圍內 - RPOP
RPOP key 取出並獲取列表中的最後一個元素 - RPOPLPUSH
RPOPLPUSH source destination 刪除最後一個元素的列表,將其附加到另一個列表並返回它 - RPUSH
RPUSH key value1 [value2] 新增一個或多個值到列表 - RPUSHX
RPUSHX key value 新增一個值列表,僅當列表中存在
使用示例
redis 127.0.0.1:6379> lpush list1 redis
(integer) 1
redis 127.0.0.1:6379> lpush list1 hello
(integer) 2
redis 127.0.0.1:6379> rpush list1 world
(integer) 3
redis 127.0.0.1:6379> llen list1
(integer) 3
redis 127.0.0.1:6379> lrange list1 0 3
1) "hello"
2) "redis"
3) "world"
redis 127.0.0.1:6379> lpop list1
"hello"
redis 127.0.0.1:6379> rpop list1
"world"
redis 127.0.0.1:6379> lrange list1 0 3
1) "redis"
3. Hash(字典,雜湊表)
類似C#中的dict型別或者C++中的hash_map型別。
Redis Hash對應Value內部實際就是一個HashMap,實際這裡會有2種不同實現,這個Hash的成員比較少時Redis為了節省記憶體會採用類似一維陣列的方式來緊湊儲存,而不會採用真正的HashMap結構,對應的value redisObject的encoding為zipmap,當成員數量增大時會自動轉成真正的HashMap,此時encoding為ht。
應用場景
假設有多個使用者及對應的使用者資訊,可以用來儲存以使用者ID為key,將使用者資訊序列化為比如json格式做為value進行儲存。
相關命令
- HDEL
HDEL key field[field...] 刪除物件的一個或幾個屬性域,不存在的屬性將被忽略 - HEXISTS
HEXISTS key field 檢視物件是否存在該屬性域 - HGET
HGET key field 獲取物件中該field屬性域的值 - HGETALL
HGETALL key 獲取物件的所有屬性域和值 - HINCRBY
HINCRBY key field value 將該物件中指定域的值增加給定的value,原子自增操作,只能是integer的屬性值可以使用 - HINCRBYFLOAT
HINCRBYFLOAT key field increment 將該物件中指定域的值增加給定的浮點數 - HKEYS
HKEYS key 獲取物件的所有屬性欄位 - HVALS
HVALS key 獲取物件的所有屬性值 - HLEN
HLEN key 獲取物件的所有屬性欄位的總數 - HMGET
HMGET key field[field...] 獲取物件的一個或多個指定欄位的值 - HSET
HSET key field value 設定物件指定欄位的值 - HMSET
HMSET key field value [field value ...] 同時設定物件中一個或多個欄位的值 - HSETNX
HSETNX key field value 只在物件不存在指定的欄位時才設定欄位的值 - HSTRLEN
HSTRLEN key field 返回物件指定field的value的字串長度,如果該物件或者field不存在,返回0. - HSCAN
HSCAN key cursor [MATCH pattern] [COUNT count] 類似SCAN命令
使用示例
127.0.0.1:6379> hset person name jack
(integer) 1
127.0.0.1:6379> hset person age 20
(integer) 1
127.0.0.1:6379> hset person sex famale
(integer) 1
127.0.0.1:6379> hgetall person
1) "name"
2) "jack"
3) "age"
4) "20"
5) "sex"
6) "famale"
127.0.0.1:6379> hkeys person
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hvals person
1) "jack"
2) "20"
3) "famale"
4. Set(集合)
可以理解為一堆值不重複的列表,類似數學領域中的集合概念,且Redis也提供了針對集合的求交集、並集、差集等操作。
set 的內部實現是一個 value永遠為null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的原因。
應用場景
Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在於set是可以自動排重的,當你需要儲存一個列表資料,又不希望出現重複資料時,set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的重要介面,這個也是list所不能提供的。
又或者在微博應用中,每個使用者關注的人存在一個集合中,就很容易實現求兩個人的共同好友功能。
相關命令
- SADD
SADD key member [member ...] 新增一個或者多個元素到集合(set)裡 - SACRD
SCARD key 獲取集合裡面的元素數量 - SDIFF
SDIFF key [key ...] 獲得佇列不存在的元素 - SDIFFSTORE
SDIFFSTORE destination key [key ...] 獲得佇列不存在的元素,並存儲在一個關鍵的結果集 - SINTER
SINTER key [key ...] 獲得兩個集合的交集 - SINTERSTORE
SINTERSTORE destination key [key ...] 獲得兩個集合的交集,並存儲在一個集合中 - SISMEMBER
SISMEMBER key member 確定一個給定的值是一個集合的成員 - SMEMBERS
SMEMBERS key 獲取集合裡面的所有key - SMOVE
SMOVE source destination member 移動集合裡面的一個key到另一個集合 - SPOP
SPOP key [count] 獲取並刪除一個集合裡面的元素 - SRANDMEMBER
SRANDMEMBER key [count] 從集合裡面隨機獲取一個元素 - SREM
SREM key member [member ...] 從集合裡刪除一個或多個元素,不存在的元素會被忽略 - SUNION
SUNION key [key ...] 新增多個set元素 - SUNIONSTORE
SUNIONSTORE destination key [key ...] 合併set元素,並將結果存入新的set裡面 - SSCAN
SSCAN key cursor [MATCH pattern] [COUNT count] 迭代set裡面的元素
使用示例
127.0.0.1:6379> hset person name jack
(integer) 1
127.0.0.1:6379> hset person age 20
(integer) 1
127.0.0.1:6379> hset person sex famale
(integer) 1
127.0.0.1:6379> hgetall person
1) "name"
2) "jack"
3) "age"
4) "20"
5) "sex"
6) "famale"
127.0.0.1:6379> hkeys person
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hvals person
1) "jack"
2) "20"
3) "famale"
使用集合資料結構的典型用例是朋友名單的實現:
redis 127.0.0.1:6379> sadd friends:leto ghanima paul chani jessica
(integer) 4
redis 127.0.0.1:6379> sadd friends:duncan paul jessica alia
(integer) 3
redis 127.0.0.1:6379> sismember friends:leto jessica
(integer) 1 #不管一個使用者有多少個朋友,我們都能高效地(O(1)時間複雜度)識別出使用者X是不是使用者Y的朋友
redis 127.0.0.1:6379> sismember friends:leto vladimir
(integer) 0
redis 127.0.0.1:6379> sinter friends:leto friends:duncan #我們可以檢視兩個或更多的人是不是有共同的朋友
1) "paul"
2) "jessica"
redis 127.0.0.1:6379> sinterstore friends:leto_duncan friends:leto friends:duncan # 可以在一個新的關鍵字裡儲存結果
(integer) 2
5. Sorted Set(有序集合)
Redis有序集合類似Redis集合,不同的是增加了一個功能,即集合是有序的。一個有序集合的每個成員帶有分數,用於進行排序。
Redis有序集合新增、刪除和測試的時間複雜度均為O(1)(固定時間,無論裡面包含的元素集合的數量)。列表的最大長度為2^32- 1元素(4294967295,超過40億每個元素的集合)。
Redis sorted set的內部使用HashMap和跳躍表(SkipList)來保證資料的儲存和有序,HashMap裡放的是成員到score的對映,而跳躍表裡存放的是所有的成員,排序依據是HashMap裡存的score,使用跳躍表的結構可以獲得比較高的查詢效率,並且在實現上比較簡單。
使用場景
Redis sorted set的使用場景與set類似,區別是set不是自動有序的,而sorted set可以通過使用者額外提供一個優先順序(score)的引數來為成員排序,並且是插入有序的,即自動排序。當你需要一個有序的並且不重複的集合列表,那麼可以選擇sorted set資料結構,比如twitter 的public timeline可以以發表時間作為score來儲存,這樣獲取時就是自動按時間排好序的。
又比如使用者的積分排行榜需求就可以通過有序集合實現。還有上面介紹的使用List實現輕量級的訊息佇列,其實也可以通過Sorted Set實現有優先順序或按權重的佇列。
相關命令
- ZADD
ZADD key score1 member1 [score2 member2] 新增一個或多個成員到有序集合,或者如果它已經存在更新其分數 - ZCARD
ZCARD key 得到的有序集合成員的數量 - ZCOUNT
ZCOUNT key min max 計算一個有序集合成員與給定值範圍內的分數 - ZINCRBY
ZINCRBY key increment member 在有序集合增加成員的分數 - ZINTERSTORE
ZINTERSTORE destination numkeys key [key ...] 多重交叉排序集合,並存儲生成一個新的鍵有序集合。 - ZLEXCOUNT
ZLEXCOUNT key min max 計算一個給定的字典範圍之間的有序集合成員的數量 - ZRANGE
ZRANGE key start stop [WITHSCORES] 由索引返回一個成員範圍的有序集合(從低到高) - ZRANGEBYLEX
ZRANGEBYLEX key min max [LIMIT offset count]返回一個成員範圍的有序集合(由字典範圍) - ZRANGEBYSCORE
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 返回有序集key中,所有 score 值介於 min 和 max 之間(包括等於 min 或 max )的成員,有序整合員按 score 值遞增(從小到大)次序排列 - ZRANK
ZRANK key member 確定成員的索引中有序集合 - ZREM
ZREM key member [member ...] 從有序集合中刪除一個或多個成員,不存在的成員將被忽略 - ZREMRANGEBYLEX
ZREMRANGEBYLEX key min max 刪除所有成員在給定的字典範圍之間的有序集合 - ZREMRANGEBYRANK
ZREMRANGEBYRANK key start stop 在給定的索引之內刪除所有成員的有序集合 - ZREMRANGEBYSCORE
ZREMRANGEBYSCORE key min max 在給定的分數之內刪除所有成員的有序集合 - ZREVRANGE
ZREVRANGE key start stop [WITHSCORES] 返回一個成員範圍的有序集合,通過索引,以分數排序,從高分到低分 - ZREVRANGEBYSCORE
ZREVRANGEBYSCORE key max min [WITHSCORES] 返回一個成員範圍的有序集合,以socre排序從高到低 - ZREVRANK
ZREVRANK key member 確定一個有序集合成員的索引,以分數排序,從高分到低分 - ZSCORE
ZSCORE key member 獲取給定成員相關聯的分數在一個有序集合 - ZUNIONSTORE
ZUNIONSTORE destination numkeys key [key ...] 新增多個集排序,所得排序集合儲存在一個新的鍵 - ZSCAN
ZSCAN key cursor [MATCH pattern] [COUNT count] 增量迭代排序元素集和相關的分數
使用示例
redis 127.0.0.1:6379> zadd dbs 100 redis
(integer) 1
redis 127.0.0.1:6379> zadd dbs 98 memcached
(integer) 1
redis 127.0.0.1:6379> zadd dbs 99 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd dbs 99 leveldb
(integer) 1
redis 127.0.0.1:6379> zcard dbs
(integer) 4
redis 127.0.0.1:6379> zcount dbs 10 99
(integer) 3
redis 127.0.0.1:6379> zrank dbs leveldb
(integer) 1
redis 127.0.0.1:6379> zrank dbs other
(nil)
redis 127.0.0.1:6379> zrangebyscore dbs 98 100
1) "memcached"
2) "leveldb"
3) "mongodb"
4) "redis"