redis是一個基於內存的高性能key-value數據庫。採用CS架構,支持多種數據結構。因爲是內存型數據庫,所以Redis的性能非常出色,每秒可以處理超過 10萬次讀寫操作。
Redis支持的數據類型
String
List
Set
ZSet
Hash
Redis持久化
Redis 提供了多種不同級別的持久化方式:
l RDB 持久化可以在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot)。
l AOF 持久化記錄服務器執行的所有寫操作命令,並在服務器啓動時,通過重新執行這些命令來還原數據集。 AOF 文件中的命令全部以 Redis 協議的格式來保存,新命令會被追加到文件的末尾。 Redis 還可以在後臺對 AOF 文件進行重寫(rewrite),使得 AOF 文件的體積不會超出保存數據集狀態所需的實際大小。
l Redis 還可以同時使用 AOF 持久化和 RDB 持久化。在這種情況下, 當 Redis 重啓時, 它會優先使用 AOF 文件來還原數據集, 因爲 AOF 文件保存的數據集通常比RDB 文件所保存的數據集更完整。
l 你甚至可以關閉持久化功能,讓數據只在服務器運行時存在。
l 瞭解 RDB 持久化和 AOF 持久化之間的異同是非常重要的, 以下幾個小節將詳細地介紹這這兩種持久化功能, 並對它們的相同和不同之處進行說明。
RDB 的優點
l RDB 是一個非常緊湊(compact)的文件,它保存了 Redis 在某個時間點上的數據集。這種文件非常適合用於進行備份:比如說,你可以在最近的 24 小時內,每小時備份一次 RDB 文件,並且在每個月的每一天,也備份一個 RDB 文件。這樣的話,即使遇上問題,也可以隨時將數據集還原到不同的版本。
l RDB 非常適用於災難恢復(disaster recovery):它只有一個文件,並且內容都非常緊湊,可以(在加密後)將它傳送到別的數據中心,或者亞馬遜 S3 中。
l RDB 可以最大化 Redis 的性能:父進程在保存 RDB 文件時唯一要做的就是 fork 出一個子進程,然後這個子進程就會處理接下來的所有保存工作,父進程無須執行任何磁盤 I/O 操作。
l RDB 在恢復大數據集時的速度比 AOF 的恢復速度要快。
RDB 的缺點
l 如果你需要儘量避免在服務器故障時丟失數據,那麼 RDB 不適合你。雖然 Redis 允許你設置不同的保存點(save point)來控制保存 RDB 文件的頻率,但是, 因爲RDB 文件需要保存整個數據集的狀態, 所以它並不是一個輕鬆的操作。 因此你可能會至少 5 分鐘才保存一次 RDB 文件。 在這種情況下, 一旦發生故障停機, 你就可能會丟失好幾分鐘的數據。
l 每次保存 RDB 的時候,Redis 都要 fork() 出一個子進程,並由子進程來進行實際的持久化工作。 在數據集比較龐大時,fork() 可能會非常耗時,造成服務器在某某毫秒內停止處理客戶端;如果數據集非常巨大,並且 CPU 時間非常緊張的話,那麼這種停止時間甚至可能會長達整整一秒。雖然 AOF 重寫也需要進行 fork() ,但無論 AOF 重寫的執行間隔有多長,數據的耐久性都不會有任何損失。
AOF 的優點
l 使用 AOF 持久化會讓 Redis 變得非常耐久(muchmore durable):你可以設置不同的 fsync 策略,比如無 fsync ,每秒鐘一次 fsync ,或者每次執行寫入命令時 fsync 。 AOF 的默認策略爲每秒鐘 fsync 一次,在這種配置下,Redis 仍然可以保持良好的性能,並且就算髮生故障停機,也最多隻會丟失一秒鐘的數據( fsync 會在後臺線程執行,所以主線程可以繼續努力地處理命令請求)。
l AOF 文件是一個只進行追加操作的日誌文件(append only log),因此對 AOF 文件的寫入不需要進行 seek ,即使日誌因爲某些原因而包含了未寫入完整的命令(比如寫入時磁盤已滿,寫入中途停機,等等), redis-check-aof 工具也可以輕易地修復這種問題。
l Redis 可以在 AOF 文件體積變得過大時,自動地在後臺對 AOF 進行重寫:重寫後的新 AOF 文件包含了恢復當前數據集所需的最小命令集合。整個重寫操作是絕對安全的,因爲 Redis 在創建新 AOF 文件的過程中,會繼續將命令追加到現有的 AOF 文件裏面,即使重寫過程中發生停機,現有的AOF 文件也不會丟失。而一旦新 AOF 文件創建完畢,Redis 就會從舊 AOF 文件切換到新 AOF 文件,並開始對新 AOF 文件進行追加操作。
l AOF 文件有序地保存了對數據庫執行的所有寫入操作,這些寫入操作以 Redis 協議的格式保存,因此 AOF 文件的內容非常容易被人讀懂,對文件進行分析(parse)也很輕鬆。導出(export) AOF 文件也非常簡單:舉個例子, 如果你不小心執行了FLUSHALL 命令,但只要 AOF 文件未被重寫,那麼只要停止服務器,移除 AOF 文件末尾的 FLUSHALL 命令,並重啓 Redis ,就可以將數據集恢復到 FLUSHALL 執行之前的狀態。
AOF 的缺點
l 對於相同的數據集來說,AOF文件的體積通常要大於 RDB 文件的體積。
l 根據所使用的 fsync 策略,AOF 的速度可能會慢於 RDB 。 在一般情況下, 每秒 fsync 的性能依然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負荷之下也是如此。 不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間(latency)。
l AOF 在過去曾經發生過這樣的 bug :因爲個別命令的原因,導致 AOF 文件在重新載入時,無法將數據集恢復成保存時的原樣。(舉個例子,阻塞命令 BRPOPLPUSH 就曾經引起過這樣的 bug 。)測試套件裏爲這種情況添加了測試:它們會自動生成隨機的、複雜的數據集,並通過重新載入這些數據來確保一切正常。雖然這種 bug 在 AOF 文件中並不常見,但是對比來說, RDB 幾乎是不可能出現這種 bug 的。
RDB 和 AOF ,我應該用哪一個?
一般來說,如果想達到足以媲美 PostgreSQL 的數據安全性,你應該同時使用兩種持久化功能。
如果你非常關心你的數據,但仍然可以承受數分鐘以內的數據丟失,那麼你可以只使用 RDB 持久化。
有很多用戶都只使用 AOF 持久化,但我們並不推薦這種方式:因爲定時生成 RDB 快照(snapshot)非常便於進行數據庫備份,並且 RDB 恢復數據集的速度也要比 AOF 恢復的速度要快,除此之外, 使用 RDB 還可以避免之前提到的AOF 程序的 bug 。
下載
Redis的官網是:http://redis.io/download
解壓tar –xvf redis.tar.gz
編譯
cd redis
make
make install
生成文件:
redis-server redis服務啓動
redis-sentinel 監控管理
redis-cli redis命令行
redis-check-aof aof快速修復
redis-check-rdb rdb快速修復
啓動方式
redis-server --port 6379
redis-server redis.conf
Redis連接方式
redis-cli –h <host> -p <port>
Redis配置文件常用配置
# 指定允許訪問的IP
bind 127.0.0.1
# 日誌文件
logfile redis.log
# redis最大可用內存
maxmemory <bytes>
<span style="white-space:pre"> </span>參數:
<span style="white-space:pre"> </span>1024mb
<span style="white-space:pre"> </span>1gb
# redis內存清除策略
maxmemory-policy <policy>
參數:
volatile-lru<span style="white-space:pre"> </span>對"過期集合"中的數據採取LRU(近期最少使用)算法
allkeys-lru<span style="white-space:pre"> </span>對所有的數據,採用LRU算法
volatile-random<span style="white-space:pre"> </span>對"過期集合"中的數據採取"隨即選取"算法
allkeys-random<span style="white-space:pre"> </span>對所有的數據,採取"隨機選取"算法
volatile-ttl<span style="white-space:pre"> </span>對"過期集合"中的數據採取TTL算法(最小存活時間),移除即將過期的數據
noeviction<span style="white-space:pre"> </span>不做任何干擾操作,直接返回OOM異常
# 開啓後redis會把所接收到的每一次寫操作請求都追加到appendonly.aof,,當redis 重新啓動時,會從該文件恢復出之前的狀態。
appendonly yes
# aof文件名字,默認爲appendonly.aof
appendfilename appendonly.aof
# rdb文件名字,默認爲dump.rdb
dbfilename dump.rdb
Redis常用命令
keys {key} 取出當前匹配的所有key
exists {key} 當前的key是否存在
del {key} 刪除當前key
rename 重命名key
更多命令:http://doc.redisfans.com/