如今大多數開發人員都會據說過 Redis。Redis 是目前市場上最好的開源內存 NoSQL 數據庫之一。它爲前端以及後端服務(如鍵值查找,隊列,哈希等)提供了很是多的幫助。前端
1、什麼是 Redis?數據庫
根據 Redis 官方介紹,Redis 是一個開源(BSD許可),內存數據結構存儲,用做數據庫,緩存和消息代理,它支持字符串、哈希表、列表、集合、有序集合、位圖、hyperloglogs 等數據類型。後端
2、Redis 與 Memcached緩存
Redis 是一個數據結構服務器。做爲鍵值數據存儲,Redis 相似於 Memcached,但它比 Memcached 有兩個主要優勢:支持更多的數據類型以及持久化。安全
持久化使得你能夠將 Redis 當作合法數據庫進行操做,而不是一個不穩定的臨時緩存。若是從新啓動,Memcached 信息將丟失; 但 Redis 數據仍然存在。服務器
Redis 支持存儲多種類型數據。跟 Memcached 同樣可使用字符串。並且你還能夠處理 hash(哈希),set(全部不一樣值的未排序),zset(全部不一樣值的排序)和 list(可能包括重複的排序)。數據結構
3、Redis 如何運做?性能
數據庫將數據存儲在磁盤或 SSD 上,而 Redis 的數據是駐留在內存中。因爲無需訪問磁盤,Redis 等內存數據存儲避免了查找時間延遲,而且能夠在幾微秒內訪問數據。Redis 提供多種數據結構、高可用性、地理空間、Lua 腳本、事務、磁盤持久性和羣集支持,讓實時互聯網級應用程序的構建變得更加簡單。代理
4、Redis 持久化日誌
如今能夠經過兩種不一樣的方式實現持久性:一種稱爲快照,是一種半持久性模式,指定的時間間隔內生成數據集的時間點快照,以 RDB(Redis DataBase) 轉儲格式編寫。從版本1.1開始,有更安全的替代方案 AOF(Append Only File),它的出現是爲了彌補 RDB 的不足(數據的不一致性),採用日誌的形式來記錄每一個寫操做並追加在文件中。
5、RDB 和 AOF ,我應該用哪個?
通常來講,若是想達到足以媲美 PostgreSQL 的數據安全性, 你應該同時使用 RDB 和 AOF 兩種持久化功能。
AOF 默認狀況下,Redis 每2秒將數據寫入文件系統,根據需求設置時間。若是在默認設置下系統出現故障,則只會丟失幾秒鐘的數據。若是你能夠承受數分鐘之內的數據丟失, 那麼你能夠只使用 RDB 持久化。
有不少人會單獨使用 AOF,可是咱們並不鼓勵這樣,由於時常進行 RDB 快照很是方便於數據庫備份,啓動速度也較之快,還避免了AOF 引擎的 bug。
6、常見案例
緩存 - 因爲其高性能,當讀寫操做量超過傳統數據庫的功能時,能夠經過 Redis 進行解決。因爲 Redis 可以輕鬆的將數據持久保存到磁盤和豐富數據類型,所以它是傳統 Memcached 緩存解決方案的絕佳替代方案。
發佈和訂閱 - 從版本 2.0 開始,Redis 提供了使用發佈/訂閱消息傳遞範例分發數據的功能。
隊列 - 像 Resque 這樣的項目使用 Redis 做爲排隊後臺做業的後端。
遊戲排行榜- Redis 是尋求構建實時排行榜的遊戲開發者的熱門選擇。可直接使用 Redis 有序集數據結構,此結構實現了元素的惟一性,同時又可維護按用戶分數排序的列表。你也可使用時間戳做爲分數,使用有序集處理時間序列數據。
實時分析-Redis 可做爲內存中數據存儲,與流處理平臺(例如 Apache Kafka)搭配使用,以亞毫秒級延遲提取、處理和分析實時數據。Redis 是實時分析使用案例的理想選擇,例如社交媒體分析、廣告投放、個性化。
7、示例 Redis 基本命令
下面我簡單講解 Redis-CLI 基本命令操做,默認狀況下,Redis-CLI在端口 6379 上運行。
SET (設置密鑰)
127.0.0.1:6379> SET foo "Hello World" OK // 設置密鑰
GET (獲取密鑰)
127.0.0.1:6379> GET foo "Hello World" // 獲取密鑰
DEL (刪除密鑰)
127.0.0.1:6379> GET foo "Hello World" 127.0.0.1:6379> DEL foo (integer) 1 // 密鑰剛被刪除 127.0.0.1:6379> GET foo (nil) // 密鑰被刪除,結果爲nil。
SETEX (設置有效期限的密鑰)
127.0.0.1:6379> SETEX foo 40 "I said, Hello World!" OK //密鑰已設置爲40秒到期
TTL (密鑰的剩餘時間)
127.0.0.1:6379> TTL foo (integer) 36 //36秒超時
PERSIST (密鑰刪除期限)
127.0.0.1:6379> PERSIST foo (integer) 1 //將密鑰轉爲持久化(密鑰不會過時)
RENAME (重命名當前現有密鑰)
127.0.0.1:6379> RENAME foo bar OK // 將鍵'foo'重命名爲 'bar'
FLUSHALL (清空到目前爲止保存的全部內容)
127.0.0.1:6379> flushall OK // 刪庫跑路
8、小結
Redis 有着極其豐富的數據類型和極高性能,性能上讀的速度是110000次/s,寫的速度是81000次/s 。可是 Redis 不是萬能的,受到物理內存的限制,不能用做海量數據的高性能讀寫,所以 Redis 適合的場景主要侷限在較小數據量的高性能操做和運算上。