Redis 緩存數據庫
第1章 Redis簡介:
redis是使用C語言編寫的開源的,支持網絡,基於內存,可持久性的鍵值對存儲數據庫,2013年5月之前,Redis是最流行的鍵值對存儲數據庫
Redis采用內存數據集,支持多種數據類型
官方網站:https://redis.io
官方各版本下載地址:http://download.redis.io/releases/
Redis 中文命令參考:http://redisdoc.com
中文網站1:http://redis.cn
中文網站2:http://www.redis.net.cn
1.1 Redis特性:
1. 高速讀寫,數據類型豐富
2. 支持持久化,多種內存分配及回收策略
3. 支持弱事務,消息隊列,消息訂閱
4. 支持高可用,支持分布式分片集群
1.2 企業緩存數據庫解決方案對比:
memcached:
1. 優點 : 高性能讀寫,單一數據類型,支持客戶端式分布式集群,一致性hash多核結構,多線程讀寫性能高
2. 缺點 : 無持久化,節點故障可能出現緩存穿透,分布式需要客戶端實現,跨房數據同步困難,架構擴容復雜
Redis:
1. 優點 : 高性能讀寫,多數據類型支持,數據持久化,高可用架構,支持定義虛擬內存,支持分布式分片集群,單線程讀寫性能極高
2. 缺點 : 多線程讀寫比memcached慢
Tair:
1.
2. 缺點 : 單機情況下,讀寫性能較其他兩種產品較慢
1.1 Redis應用場景:
數據高速緩存,web會話緩存
排行榜應用
消息隊列,發布訂閱
第1章 Redis安裝部署:
1.1 環境說明:
[root@gitlab ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@gitlab ~]# uname -r 3.10.0-327.el7.x86_64 [root@gitlab ~]# getenforce Disabled [root@gitlab ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead)
1.2 下載地址:
wget http://download.redis.io/releases/redis-3.2.10.tar.gz
1.3 安裝redis:
[root@gitlab application]# tar xzf redis-3.2.10.tar.gz [root@gitlab application]# ll total 1520 drwxrwxr-x 6 root root 4096 Jul 28 2017 redis-3.2.10 -rw-r--r-- 1 root root 1550261 Jul 29 2017 redis-3.2.10.tar.gz [root@gitlab application]# mv redis-3.2.10 redis [root@gitlab application]# mv redis-3.2.10.tar.gz /server/tools/ [root@gitlab application]# ll total 4 drwxrwxr-x 6 root root 4096 Jul 28 2017 redis [root@gitlab application]# cd redis/ [root@gitlab redis]# make
至此安裝完成
1.4 啟動第一個Redis實例
[root@gitlab redis]# cd src/ [root@gitlab src]# ./redis-server &
第2章 Redis操作
2.1 Redis配置文件:
[root@gitlab src]# mkdir -p /data/6379 [root@gitlab src]# vim /etc/redis.conf daemonize yes port 6379 logfile /data/6379/redis.log dbfilename dump.rdb dir /data/6379 protected-mode no 保護模式,是否開啟本地訪問 bind 10.0.0.63 指定redis監聽地址,可以通過這個地址進行網絡連接到數據庫
2.1.1 在查詢配置:
10.0.0.63:6379> CONFIG GET * 1) "dbfilename" 2) "dump.rdb"
2.1.2 在線修改配置:
10.0.0.63:6379> CONFIG SET requirepass 123 OK 10.0.0.63:6379> CONFIG GET requirepass (error) NOAUTH Authentication required. 10.0.0.63:6379> auth (error) ERR wrong number of arguments for 'auth' command 10.0.0.63:6379> auth 123 OK 10.0.0.63:6379> CONFIG GET requirepass 1) "requirepass" 2) "123" 10.0.0.63:6379>
第3章 Redis數據持久化
3.1 什麽是持久化?
緩存數據庫在宕機或者重啟後,還可以重新構造內存中的數據,持久保持數據
3.2 持久化的種類:
RDB持久化:
基於快照的持久化功能,保存一個時刻的數據狀態,企業中常用的持久化功能,一般還可以以用作備份
AOF持久化:
只追加日誌模式,會將redis一段時間內的所有修改命令記錄下來,屬於比較安全的一種持久化方式
3.3 RDB持久化的優缺點:
3.3.1 優點:
1. RDB是一個非常緊湊的文件,它保存了Redis在某個時間點上的數據集,這種文件非常適用於進行備份,比如說你可以在最近的24小時內,每小時備份一次RDB文件,並且在每個月的每一天,也備份一個RDB文件,這樣,即使遇到問題,也可以隨時將數據集還原到不同的版本
2. RDB非常適用於災難恢復:它只有一個文件,並且內容都非常緊湊,可以將它傳送到別的數據中心
3. RDB可以最大化Redis的性能,父進程在保存RDB文件時唯一要做的就是fork出一個子進程,然後這個子進程就會處理接下來的所有保存工作,父進程無須執行任何磁盤IO操作
4. RDB在恢復大數據集時的速度比AOF快
3.3.2 缺點:
1. 如果你需要盡量避免在服務器故障時丟失數據,那麽RDB不適用,因為RDB文件需要保存整個數據集的狀態,所以這並不是一個輕松的操作,因此你可能至少5分鐘才保存一次文件,在這種情況下,一旦發生故障,你就可能會丟失幾分鐘的數據
2. 每次保存RDB的時候,Redis都要fork出一個子進程,並由子進程來進行實際的持久化工作,在數據集比較龐大時,fork可能會非常耗時,造成服務器在某某毫秒內停止處理客戶端,如果數據集非常龐大,並且CPU時間非常緊張的話,那麽這種停止時間可能會長達整整一秒,雖然AOF重寫也需要進行fork,但無論AOF重寫的執行間隔有多長,數據的耐久性都不會有任何損失
3.4 AOF持久化的優缺點:
優點:
1. 使用AOF會讓你的Redis更加耐久,你可以使用不同的fsync策略,無fsync,每秒fsync,每次寫的時候fsync,使用默認的每秒fsync策略,Redis的性能依然很好,fsync是由後臺線程進行處理的,主線程會盡力處理客戶端請求,一旦出現故障,你最多丟死1秒的數據
2. Redis可以在AOF文件體積變的過大時,自動的在後臺對AOF進行重寫,重寫後端額AOF文件包含了恢復當前數據集所需的最小命令集合,整個重寫操作是絕對安全的,因為Redis在創建AOF文件的過程中,會繼續將命令追加到現有的AOF文件裏面,即使重寫過程中發生宕機,現有的AOF文件也不會丟失
3. 一旦新AOF文件創建完畢,Redis就會從舊AOF文件切換到新的AOF文件,並開始對AOF文件進行追加操作
4. AOF文件有序的保存了對數據庫執行的所有寫操作,這些寫入操作以Redis協議的格式保存,因此AOF文件的內容非常同意被人讀懂,對文件進行分析,也很輕松,導出AOF文件也非常簡單,舉個例子,如果你不小心執行了flushall命令,但只要AOF文件未被重寫,那麽只要停止服務器,移除AOF文件末尾的flushall命令,並重啟Redis,就可以將數據集恢復到flushall執行之前的狀態
缺點:
1. 對於相同的數據集來說,AOF文件的體積通常要大於RDB文件的體積,根據所使用的fsync策略,AOF的速度可能會慢於RDB
2. 在一般情況下,每秒fsync的性能依然非常高,而關閉fsync可以讓AOF的速度和RDB一樣快,即使在高負荷之下也是如此,不顧在處理巨大的寫入載入時,RDB可以提供更有保證的最大延遲時間
3. AOF在過去曾經發生過這樣的bug,因為個別命令的原因,導致AOF文件在重新載入時,無法將數據集恢復成保存時的原樣
3.5 如何選擇使用哪種持久化方式?
一般來說,如果想要達到很高的數據安全性,應該同時使用兩種持久化功能
如果你非常關心數據的安全,並且可以承受數分鐘內的數據丟失,建議使用RDB
有很多用戶只使用AOF,但是這種方式並不推薦,因為定時生成的RDB快照非常便於數據庫進行備份,並且RDB恢復數據的速度要比AOF快很多,而且好友AOF的bug問題
3.6 快照實現持久化:
在默認情況下, Redis 將數據庫快照保存在名字為 dump.rdb的二進制文件中。你可以對 Redis 進行設置, 讓它在“ N 秒內數據集至少有 M 個改動”這一條件被滿足時, 自動保存一次數據集。
你也可以通過調用 SAVE或者 BGSAVE , 手動讓 Redis 進行數據集保存操作。
比如說, 以下設置會讓 Redis 在滿足“ 60 秒內有至少有 1000 個鍵被改動”這一條件時, 自動保存一次數據集: save 60 1000
這種持久化方式被稱為快照 snapshotting.
3.6.1 當 Redis 需要保存 dump.rdb 文件時, 服務器執行以下操作:
Redis 緩存數據庫