[英]Does Redis persist data?
我知道 Redis 從內存中提供所有數據,但它是否也能在服務器重新啟動后持續存在,以便在服務器重新啟動時將磁盤中的所有數據讀入內存。 或者它總是一個空白存儲,僅在應用程序運行時存儲數據而沒有持久性?
我建議您在http://redis.io/topics/persistence上閱讀有關此內容的信息。 基本上,當您僅使用內存存儲來提高性能時,就會失去保證的持久性。 想象一個場景,您 INSERT 到內存中,但在它被持久化到磁盤之前就斷電了。 會有數據丟失。
Redis 支持所謂的“快照”。 這意味着它將在某些時間點(例如,每整整一小時)對內存中的內容進行完整復制。 當您在兩次快照之間斷電時,您將丟失上次快照和崩潰之間的數據(不一定是停電..)。 Redis 在數據安全與性能之間進行權衡,就像大多數 NoSQL-DB 一樣。
大多數 NoSQL 數據庫遵循在多個節點之間復制的概念,以最大限度地減少這種風險。 Redis 更被認為是一種快速緩存,而不是保證數據一致性的數據庫。 因此,它的用例通常與真實數據庫的用例不同:例如,您可以存儲會話、性能計數器或其中的任何具有無與倫比的性能並且在崩潰時不會真正丟失的東西。 但是處理訂單/購買歷史記錄等被認為是傳統數據庫的工作。
Redis 服務器不時將其所有數據保存到 HDD,從而提供一定程度的持久性。
它在以下情況之一中保存數據:
BGSAVE
命令時但是redis中的數據並不是真正持久化的,因為:
BGSAVE
操作只有在你有足夠的空閑RAM時才能執行(額外RAM的數量等於redis DB的大小) 注意: BGSAVE
RAM 要求是一個真正的問題,因為 redis 會繼續工作,直到沒有更多的 RAM 可以運行,但它會更早地停止將數據保存到 HDD(大約為 RAM 的 50%)。
有關更多信息,請參閱Redis 持久性。
答案通常是肯定的,但是更完整的答案實際上取決於您嘗試存儲的數據類型。 一般來說,更完整的簡短答案是:
話雖如此,默認情況下 Redis將定期保留數據快照(顯然這是每 1 分鍾一次,但我尚未驗證這一點 - 下面的文章對此進行了描述,這是一個很好的基本介紹):
http://qnimate.com/redis-permanent-storage/
TL; 博士
來自官方文檔:
- RDB 持久性[默認]以指定的時間間隔執行數據集的時間點快照。
- AOF持久化[需要顯式配置]記錄服務器收到的每個寫操作,在服務器啟動時會再次播放,重建原始數據集。
如果需要,Redis 必須為 AOF 持久性顯式配置,這將導致性能損失以及日志增長。 對於有限數量的數據流的相對可靠的持久性可能就足夠了。
完全可以選擇不持久化。性能更好,但是Redis關閉時所有數據都會丟失。
Redis 有兩種持久化機制:RDB 和 AOF。RDB 使用調度程序全局快照,AOF 將更新寫入類似於 MySql 的僅附加日志文件。
您可以使用其中之一或兩者。當Redis重啟時,它通過讀取RDB文件或AOF文件來構造數據。
許多消息靈通和相對較新的用戶認為 Redis 只是一個緩存,而不是Reliable Persistence的理想選擇。 現實情況是,如今 DB、Cache(以及更多類型)之間的界限已經模糊。
它都是可配置的,作為用戶/工程師,我們可以選擇將其配置為緩存、數據庫(甚至混合)。
每一個選擇都有好處和成本。 這不是 Redis 的例外,但所有著名的分布式系統都提供了配置不同方面(持久性、可用性、一致性等)的選項。 因此,如果您在默認模式下配置 Redis,希望它能神奇地為您提供高度可靠的持久性,那么這是團隊/工程師的錯誤(而不是 Redis 的錯誤)。
我有更多的細節在我的博客中討論這些方面在這里。
另外,這里有一個來自 Redis 本身的鏈接。
該線程中的所有答案都在談論redis持久化數據的可能性: https : //redis.io/topics/persistence (每次寫入(更改)后使用AOF +)。
這是一個很好的鏈接,可以幫助您入門,但顯然沒有向您展示全貌。
Redis 文檔沒有談到:
AWS 上的 1x x1.16xlarge 實例 - 他們無法實現低於 2 毫秒的延遲:
其中延遲是從請求的第一個字節到達集群到“寫”響應的第一個字節發送回客戶端的時間測量的
他們在更好的硬盤 (Dell-EMC VMAX) 上進行了額外的基准測試,結果操作延遲小於 1 毫秒 (!!),從 70K ops/sec(寫密集測試)到 660K ops/sec(讀密集測試)。 相當感人!!!
但它絕對需要(非常)熟練的開發人員來幫助您創建此基礎架構並隨着時間的推移對其進行維護。
set x 1
,在所有其他節點中進行此(或任何)更改需要多長時間. 所以額外的讀取將收到相同的輸出。 好吧,這取決於很多因素和配置。WAIT
命令以了解其他 redis 節點收到了多少最新更改): def save_payment(payment_id)
redis.rpush(payment_id,”in progress”) # Return false on exception
if redis.wait(3,1000) >= 3 then
redis.rpush(payment_id,”confirmed”) # Return false on exception
if redis.wait(3,1000) >= 3 then
return true
else
redis.rpush(payment_id,”cancelled”)
return false
end
else
return false
end
上面的例子不夠完整,並且有一個真正的問題是提前知道每個時刻實際上有多少(和活着的)節點。
其他數據庫也會有同樣的問題。 也許他們有更好的 API,但問題仍然存在。
據我所知,很多應用程序甚至都沒有意識到這個問題。
總而言之,選擇更多的dbs節點不是一鍵配置。 它涉及更多。
總結這項研究,做什么取決於:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.