1. redis的概述
Redis(Remote Dictionary Server,遠程字典服務)是一種非關係型(NoSQL)數據庫 ,它是一個開源的使用 c語言編寫的key-value存儲系統(區別於MySQL的二維表格的形式存儲)
Redis會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,實現數據的持久化
redis官網地址:
中文網站
http://www.redis.cn/
redis具有如下特點:
- 高讀寫性:Redis讀取的速度是110000次/s,寫的速度是81000次/s
- 原子性:Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全並後的原子性執行
- 支持多種數據結構:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)
- 穩定性:主從結構
- 支持事務
- 支持過期時間
- 支持消息訂閱
2. 配置redis
2.1 下載redis安裝包並解壓
# 下載安裝包
cd /export/softwares
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
# 解壓
cd /export/softwares
tar -zxvf redis-3.2.8.tar.gz -C ../servers/
2.2 安裝C程序運行環境
yum -y install gcc-c++
2.3 安裝tcl
Tcl(tool command language)是一種簡單的腳本語言,主要使用於發佈命令給一 些互交程序如文本編輯器、調試器和shell。它有一個簡單的語法 和很強可擴充性,Tcl可以創建新的過程以增強其內建命令的能力。
其次,Tcl是一個庫包,可以被嵌入應用程序,Tcl的庫包含了一個分析器、用於執行內建命令的例程和可以使你擴充(定義新的 過程)的庫函數。應用程序可以產生Tcl命令並執行,命令可以由用戶產生,也可以從用戶接口的一個輸入中讀取(按鈕或菜單等)。但Tcl庫收到命令後將它分解並執行內建的命令,經常會產生遞歸的調用
yum -y install tcl
2.4 編輯redis
# 編譯
make MALLOC=libc 或 make
# 測試編譯是否完成
make test 或者 make install
2.5 修改配置文件
先要創建logs和redisdata文件夾
cd /export/servers/redis-3.2.8/
mkdir -p /export/servers/redis-3.2.8/logs
mkdir -p /export/servers/redis-3.2.8/redisdata
# 修改redis.conf
vim redis.conf
需要修改這些地方
bind hadoop1
# 後臺服務運行
daemonize yes
pidfile /var/run/redis_6379.pid
# 日誌文件路徑
logfile "/export/servers/redis-3.2.8/logs/redis.log"
# 數據存放
dir /export/servers/redis-3.2.8/redisdata
2.5.1 實現主從複製架構
# 在配置hadoop2和hadoop3時還需要加下面這條指令
slaveof hadoop1 6379
2.4.2 實現哨兵(Sentinel)架構
Sentinel(哨兵)是Redis 的高可用性解決方案:由一個或多個Sentinel 實例 組成的Sentinel 系統可以監視任意多個主服務器,以及這些主服務器屬下的所有從服務器,並在被監視的主服務器進入下線狀態時,自動將下線主服務器屬下的某個從服務器升級爲新的主服務器。
具體機制如下圖所示:
修改sentinel.conf
文件
bind hadoop1
# 後臺服務運行
daemonize yes
# 修改三臺機器監控的主節點,hadoop1是主節點,有兩臺主機監控
sentinel monitor mymaster hadoop1 6379 2
2.6 啓動redis
cd /export/servers/redis-3.2.8/
src/redis-server redis.conf
redis啓動沒有任何提醒,可以用ps -ef | grep redis
查看是否啓動
2.7 連接redis
src/redis-cli -h hadoop1
3. redis的持久化
redis的持久化也就是將數據從內存上保存到磁盤中,redis中的持久化分爲RDB和AOF兩種方式
3.1 RDB持久化方式
Redis默認開啓RDB快照,會定期保存數據到一個rbd文件中,也可以通過sava或bgsave(推薦)手動的觸發RDB快照保存
-
SAVE 直接調用 rdbSave ,阻塞 Redis 主進程,直到保存完成爲止。在主進程阻塞期間,服務器不能處理客戶端的任何請求。
-
BGSAVE 則 fork 出一個子進程,子進程負責調用 rdbSave ,並在保存完成之後向主進程發送信號,通知保存已完成。 Redis 服務器在BGSAVE 執行期間仍然可以繼續處理客戶端的請求。
RDB方案優點
-
對性能影響最小。Redis在保存RDB快照時會fork出子進程進行,幾乎不影響Redis處理客戶端請求的效率。
-
每次快照會生成一個完整的數據快照文件,所以可以輔以其他手段保存多個時間點的快照(例如把每天0點的快照備份至其他存儲媒介中),作爲非常可靠的災難恢復手段。
-
使用RDB文件進行數據恢復比使用AOF要快很多
RDB方案缺點
-
快照是定期生成的,所以在Redis crash時或多或少會丟失一部分數據。
-
如果數據集非常大且CPU不夠強(比如單核CPU),Redis在fork子進程時可能會消耗相對較長的時間,影響Redis對外提供服務的能力。
redis中的原始配置如下圖所示,可以自行進行修改
修改配置後需要重啓redis服務
# 查看redis進程
ps -ef | grep redis
# kill進程
# 啓動redis
cd /export/servers/redis-3.2.8/
src/redis-server redis.conf
3.2 AOF持久化方式
採用AOF持久方式時,Redis會把每一個寫請求都記錄在一個日誌文件裏。在Redis重啓時,會把AOF文件中記錄的所有寫操作順序執行一遍,確保數據恢復到最新。
AOF有三種fsync配置:always/everysec/no
- always:每寫入一條日誌就進行一次fsync操作,數據安全性最高
- everysec:每秒進行一次fsync
- no:不進行fsync操作,讓os自動進行flush
AOF優點:
-
最安全,在啓用appendfsync always時,任何已寫入的數據都不會丟失,使用在啓用appendfsync everysec也至多隻會丟失1秒的數據
-
AOF文件在發生斷電等問題時也不會損壞,即使出現了某條日誌只寫入了一半的情況,也可以使用redis-check-aof工具輕鬆修復。
-
AOF文件易讀,可修改,在進行了某些錯誤的數據清除操作後,只要AOF文件沒有rewrite,就可以把AOF文件備份出來,把錯誤的命令刪除,然後恢復數據。
AOF的缺點:
-
AOF文件通常比RDB文件更大
-
性能消耗比RDB高
-
數據恢復速度比RDB慢
在redis中AOF默認是關閉的,設置圖下圖所示,可以進行更改
爲了防止AOF文件過大,使得恢復時間過長,redis提供AOF rewrite功能,可以重寫AOF文件,只保留能夠把數據恢復到最新狀態的最小寫操作集。
AOF rewrite可以通過BGREWRITEAOF命令觸發,也可以配置Redis定期自動進行