數據庫結構
- redis是key-value的數據結構,每條數據都是⼀個鍵值對
- 鍵的類型是字符串
- 注意:鍵不能重複
數據類型分5種:string,hash,list,set,zset
字符串(String)
字符串類型是Redis中最爲基礎的數據存儲類型,該類型可以接受任何格式的數據,如JPEG圖像數據或Json對象描述信息等。在Redis中字符串類型的Value最多可以容納的數據長度是512M。
1. set key value // 設置鍵值
2. get key // value
3. setex key seconds value // 設置鍵值及過期時間
4. mset key1 value1 key2 value2 ... // 設置多個鍵值
5. mget key1 key2...
6. append key vvv // 向key中追加值
你可以用Redis字符串做許多有趣的事,例如你可以:
- 利用INCR命令簇(INCR, DECR, INCRBY)來把字符串當作原子計數器使用。
- 使用APPEND命令在字符串後添加內容。
- 將字符串作爲GETRANGE 和 SETRANGE的隨機訪問向量。
- 在小空間裏編碼大量數據,或者使用 GETBIT 和 SETBIT創建一個Redis支持的Bloom過濾器。
通用命令
1. del k1 k2 // 刪除鍵及對應的值
2. keys * // 查看所有key /keys k* (正則)
3. expire k1 100 // 設置過期時間
4. ttl k1 // 查看有效時間.鍵不存在爲-2,鍵永久時間爲-1
5. exists k1 // 存在爲1,不存在爲0
6. type k1 // 查看value的類型
哈希(hash)
Hashes是字符串字段和字符串值之間的映射,所以它們是完美的表示對象(eg:一個有名,姓,年齡等屬性的用戶)的數據類型。
- hash⽤於存儲對象,對象的結構爲屬性、值(key field value)
- 值的類型爲string
1. hset key field value
2. hmset key field value field2 value2 ...
3. hget key field
4. hmget key field field2 ...
5. hkeys key // 獲取key 所有field
6. hvals key // 獲取key 所有value
7. hdel key field field2 ...// 刪除key下的field及其對應的value
8. del key // 刪除鍵下所有的field及其對應的value
9. hlen key // 獲取鍵值對的個數
列表(list)
列表是簡單的字符串列表,按照插入順序排序。 你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。(頭 l1 l2 … 尾)
LPUSH 命令插入一個新元素到列表頭部,而RPUSH命令 插入一個新元素到列表的尾部。當對一個空key執行其中某個命令時,將會創建一個新表。
- 列表的元素類型爲string
- 按照插⼊順序排序
lpush key v1 v2 ... // 將新元素插在頭部(頭 ... v2 v1 尾)
rpush key l1 l2 ... // 將新元素插在尾部(頭 ... v2 v1 l1 l2 ... 尾)
lpop key // 將第一個元素刪除並拋出
linsert key before/after l1 a1 // 將新元素插在l1之前/之後
lset key index value // 更新index對應的值
lrange key start stop // 遍歷list中的元素(從0開始,左右都包),stop爲-1遍歷所有元素
lindex key index // 查看index對應的值
lrem key count value // 從左往右刪除一個或多個爲value的值 (沒有rrem)
llen key // 查看list長度
一個列表最多可以包含232-1個元素(4294967295,每個表超過40億個元素)。
從時間複雜度的角度來看,Redis列表主要的特性就是支持時間常數的插入和靠近頭尾部元素的刪除,即使是需要插入上百萬的條目。 訪問列表兩端的元素是非常快的,但如果你試着訪問一個非常大的列表的中間元素仍然是十分慢的,因爲那是一個時間複雜度爲 O(N) 的操作。
你可以用Redis列表做許多有趣的事,例如你可以:
- 在社交網絡中建立一個時間線模型,使用LPUSH去添加新的元素到用戶時間線中,使用LRANGE去檢索一些最近插入的條目。
- 你可以同時使用LPUSH和LTRIM去創建一個永遠不會超過指定元素數目的列表並同時記住最後的N個元素。
- 列表可以用來當作消息傳遞的基元(primitive),例如,衆所周知的用來創建後臺任務的Resque Ruby庫。
- 你可以使用列表做更多事,這個數據類型支持許多命令,包括像BLPOP這樣的阻塞命令。請查看所有可用的列表操作命令獲取更多的信息。
集合(Set)
Redis集合是一個無序的字符串合集。你可以以O(1) 的時間複雜度(無論集合中有多少元素時間複雜度都爲常量)完成 添加,刪除以及測試元素是否存在的操作。
Redis集合有着不允許相同成員存在的優秀特性。向集合中多次添加同一元素,在集合中最終只會存在一個此元素。實際上這就意味着,在添加元素前,你並不需要事先進行檢驗此元素是否已經存在的操作。
一個Redis列表十分有趣的事是,它們支持一些服務端的命令從現有的集合出發去進行集合運算。 所以你可以在很短的時間內完成合並(union),求交(intersection), 找出不同元素的操作。
一個集合最多可以包含232-1個元素(4294967295,每個集合超過40億個元素)。
- ⽆序集合
- 元素爲string類型
- 元素具有唯⼀性,不重複
- 說明:對於集合沒有修改操作
1. sadd key member member2 ... // 添加元素
2. smembers key // 查看所有元素
3. sismember key member // 查看指定元素是否存在,1:存在,0:不存在
4. srem key memeber ... // 刪除元素
5. sinter key key2 ... // 返回key和key2中的交集元素
6. spop key count // 隨機刪除並拋出count個元素(count省略時拋出一個元素)
7. srandmember key count // 隨機拋出count個元素(不刪除該元素)
你可以用Redis集合做很多有趣的事,例如你可以:
- 用集合跟蹤一個獨特的事。想要知道所有訪問某個博客文章的獨立IP?只要每次都用SADD來處理一個頁面訪問。那麼你可以肯定重複的IP是不會插入的。
- Redis集合能很好的表示關係。你可以創建一個tagging系統,然後用集合來代表單個tag。接下來你可以用SADD命令把所有擁有tag的對象的所有ID添加進集合,這樣來表示這個特定的tag。如果你想要同時有3個不同tag的所有對象的所有ID,那麼你需要使用SINTER.
- 使用SPOP或者SRANDMEMBER命令隨機地獲取元素。
有序集合(Sorted Set / Zset)
Redis有序集合和Redis集合類似,是不包含 相同字符串的合集。它們的差別是,每個有序集合 的成員都關聯着一個評分,這個評分用於把有序集 閤中的成員按最低分到最高分排列。
使用有序集合,你可以非常快地(O(log(N)))完成添加,刪除和更新元素的操作。 因爲元素是在插入時就排好序的,所以很快地通過評分(score)或者 位次(position)獲得一個範圍的元素。 訪問有序集合的中間元素同樣也是非常快的,因此你可以使用有序集合作爲一個沒用重複成員的智能列表。 在這個列表中, 你可以輕易地訪問任何你需要的東西: 有序的元素,快速的存在性測試,快速訪問集合中間元素!
- sorted set,有序集合
- 元素爲string類型
- 元素具有唯⼀性,不重複
- 每個元素都會關聯⼀個double類型的score,表示權重,通過權重將元素從⼩到⼤排序
- 說明:沒有修改操作
1. zadd
2. zrange
3. zrangebyscore
4. zrem
5. zremrangebyscore
6. zscore
使用有序集合你可以:
- 在一個巨型在線遊戲中建立一個排行榜,每當有新的記錄產生時,使用ZADD 來更新它。你可以用ZRANGE輕鬆地獲取排名靠前的用戶, 你也可以提供一個用戶名,然後用ZRANK獲取他在排行榜中的名次。 同時使用ZRANK和ZRANGE你可以獲得與指定用戶有相同分數的用戶名單。 所有這些操作都非常迅速。
- 有序集合通常用來索引存儲在Redis中的數據。 例如:如果你有很多的hash來表示用戶,那麼你可以使用一個有序集合,這個集合的年齡字段用來當作評分,用戶ID當作值。用ZRANGEBYSCORE可以簡單快速地檢索到給定年齡段的所有用戶。
參考文章:
- redis所有命令列表
- 數據類型(Data types):Redis支持不同類型值的摘要。
- Redis 數據類型介紹