Redis是一個速度非常快的非關系型數據庫,可以存儲鍵與5種不同類型的值之間的映射,可以將存儲在內存的鍵值對數據持久化到硬盤,可以通過復制擴展讀性能,可以使用客戶端分片來擴展寫性能。
與其他數據庫的對比
名稱 | 類型 | 數據存儲選項 | 查詢類型 | 附加功能 |
---|---|---|---|---|
Redis | 內存存儲的非關系數據庫 | 字符串、列表、集合、散列表、有序集合 | 每種數據類型有自己的專屬命令,另外還有批量操作 | 發布與訂閱,主從復制,腳本,不完全的事務支持 |
memcached | 內存存儲的鍵值緩存 | 鍵值之間的映射 | CRUD命令及其他命令 | 多線程服務器 |
MySQL | 關系數據庫 | 每個庫可包括多個表,每個表包括多行;可以處理多個表的視圖 | SQL、函數、存儲過程 | 支持ACID(InnoDB),主從復制和主主復制 |
MongoDB | 硬盤存儲的非關系文檔存儲 | 每個數據庫可以包括多個表,每個表包括多個無schema的BSON文檔 | CRUD命令及條件查詢命令 | map-reduce,主從復制,分片,空間索引 |
附加特性
- Redis作為內存數據庫支持兩種數據持久化方法:
- 時間點存儲(point-in-time dump)
- 指定時間段內有指定數量的寫操作執行
- 調用兩條轉儲到硬盤(dump-to-disk)命令
- 將所有修改了數據庫的命令寫入一個只追加(append-only)文件里,根據數據的重要程度將只追加寫入設置為從不同步、每秒同步一次貨每寫入一個命令就同步一次。
- 時間點存儲(point-in-time dump)
- 受限于內存存儲設計,一臺Redis服務器無法處理所有請求,為了擴展讀性能,并提供故障轉移(failover),Redis支持主從復制:
(1)從服務器連接到主服務器,接受主服務器發送的整個數據庫的初始副本。
(2)之后主服務器執行的寫命令,都會發送給從服務器
優勢
- 5種數據結構
- 對存儲的數據進行隨機寫的速度非常快,不需要傳統數據庫的查詢分析器或者優化器。
- 不需要寫入臨時數據
數據結構簡介
結構類型 | 結構存儲的值 | 結構的讀寫能力 |
---|---|---|
STRING | 字符串、整數、浮點數 | 對字符串或其中一部分執行操作;對整數浮點數執行自增自減 |
LIST | 鏈表,每個節點包括一個字符串 | 鏈表兩端的push、pop;根據偏移量對鏈表修剪(trim);讀取單個或多個元素;根據值查找或移除元素 |
SET | 包含字符串的無序收集器,每個字符串唯一 | 添加、獲取、刪除單個元素;檢查元素存在;計算交并差集;隨機獲取元素 |
HASH | 包含鍵值對的無序散列表 | 添加、獲取、刪除單個鍵值對;獲取所有鍵值對 |
ZSET | 字符串成員(member)與浮點數分值(score)的有序映射,元素的排列順序由分值決定 | 添加、獲取、刪除單個元素;根據分值范圍或者成員來獲取元素 |
STRING
命令 | 用法 | 結果 |
---|---|---|
SET | set key value | OK |
GET | get key | value\NULL |
DEL | del key | 1\0 |
LIST(鏈表)
命令 | 用法 | 結果 |
---|---|---|
LPUSH | lpush key value | size |
RPOP | rpop key | 彈出的value |
LRANGE | lrange key start end | [start, end]范圍內的元素 |
LINDEX | lindex key index | index位置的元素 |
其他命令包括在列表中間添加、移除元素,將列表修剪到指定長度。
SET
命令 | 用法 | 結果 |
---|---|---|
SADD | sadd key value | 1-成功;0-已存在 |
SMEMBERS | smembers key | 全部元素的序列 |
SISMEMBER | sismember key value | 1-存在;0-不存在 |
SREM | srem key value | 返回被移除的元素數量 |
集合通過散列表保證元素的唯一性,這些散列表只有鍵沒有值。SMEMBERS可能會很慢。
命令 | 用法 | 結果 |
---|---|---|
SADD | sadd key value | 1-成功;0-已存在 |
SMEMBERS | smembers key | 全部元素的序列 |
SISMEMBER | sismember key value | 1-存在;0-不存在 |
SREM | srem key value | 返回被移除的元素數量 |
SINTER、SUNION、SDIFF交并差命令。
HASH
命令 | 用法 | 結果 |
---|---|---|
HSET | hset hash-key field value | 1\0是否不存在 |
HGET | hget hash-key field | value\NULL |
HGETALL | hgetall hash-key | 所有鍵值對 |
HDEL | hdel hash-key field | 1\0是否存在 |
存儲多個鍵值對的映射,值可以是字符串或者數字值,同樣可以對數字值自增或自減。HASH類似于Redis的微縮版,所以很多字符串命令都有對應的散列版本。
命令 | 用法 | 結果 |
---|---|---|
HSET | hset hash-key field value | 1\0是否不存在 |
HGET | hget hash-key field | value\NULL |
HGETALL | hgetall hash-key | 所有鍵值對 |
HDEL | hdel hash-key field | 1\0是否存在 |
ZSET
命令 | 用法 | 結果 |
---|---|---|
ZADD | zadd key score member | 1\0是否不存在 |
ZRANGE | zrange key start end [withscores] | 根據score排序的排名在[start,end]范圍的member,withscores會多返回分值 |
ZRANGEBYSCORE | zrangebyscore key scoreS scoreE [withscores] | score在[scoreS, scoreE]范圍內的member,withscores會多返回score |
ZREM | zrem key member | 1\0是否存在 |
ZINTERSTORE | zinterstore destination keyNum key... [weights weight...] [aggregate sum|min|max] | 新ZSET元素數量 |
同樣是鍵值對,鍵是成員(member)各不相同,值是分值(score)為浮點數。有序集合是Redis里唯一一個既可以根據成員訪問元素(類似于散列),又可以根據分值以及分值的排列順序來訪問元素的結構。
命令 | 用法 | 結果 |
---|---|---|
ZADD | zadd key score member | 1\0是否不存在 |
ZRANGE | zrange key start end [withscores] | 根據score排序的排名在[start,end]范圍的member,withscores會多返回分值 |
ZRANGEBYSCORE | zrangebyscore key scoreS scoreE [withscores] | score在[scoreS, scoreE]范圍內的member,withscores會多返回score |
ZREM | zrem key member | 1\0是否存在 |
ZINTERSTORE | zinterstore destination keyNum key... [weights weight...] [aggregate sum|min|max] | 新ZSET元素數量 |
解決問題
ZSET
有序集合來實現文章的排序(發布時間、投票);
最近登錄用戶,Token對應登錄時間戳;
最近瀏覽商品,每個Item對應時間戳;
緩存更新調度,key是更新的數據Id,score是執行更新的時間戳;
記錄所有商品的瀏覽次數
HASH
HASH來存儲文章信息,每個HASH對應一個文章;
Token Cookie,每個Token為HASH中的一個Field,Value是用戶信息;
用戶購物車,每個Field對應商品Id,Value為商品數量
SET
SET用來保存已投票的用戶集合;
用來保存某個群組有哪些文章;
STRING
STRING關聯一個數值,用來做計數器
ZINTERSTORE
接受多個集合(分值視為1)或有序集合作為輸入,找出同時存在于集合和有序集合的成員,并以某種方式聚合分值(max),將結果存為一個新的ZSET;
ZINTERSTORE與ZUNIONSTORE用在一個ZSET上的時候,可以通過weights對ZSET所有元素的分值進行修改