Redis RDB 持久化問題

前言

Redis 是內存數據庫,它將自己的數據儲存在內存里面,如果不想辦法將儲存在內存中的數據保存到磁盤里面,那么一旦服務器進程退出,服務器中的數據也就沒了。

因此,Redis 提供了 RDB 持久化功能,這個功能可以將 Redis 在內存中的數據保存到磁盤里面,避免丟失。

問題描述

有兩臺計算機,分別為 A、B(A 是本機,B 是云服務器)。兩臺計算機操作系統版本,Redis 版本完全相同。

我有一些數據儲存在 A 的 Redis 中(B 無法直接獲取這些數據),我想把這些數據保存到 B 中。于是在 A 中調用 SAVE 命令生成 rdb 文件,將 rdb 文件拷貝到 B,想讓 B 加載這個 rdb 文件。

rdb 文件的加載工作是在服務器啟動時自動執行的,于是我在 B 執行以下命令:

sudo systemctl restart redis 

可是,B 的 Redis 中并沒有我預期的數據,還是 B 之前的數據。只要重啟后,我拷貝到 B 的 dump.rdb 文件就沒了,就又被替換成之前的文件了。

經過排查,B 并沒有開啟 AOF 持久化,redis.conf 配置的 dump.rdb 文件名和路徑都沒有問題。排查日志發現 rdb 文件加載正常,并沒有打印錯誤信息。

問題解決

經過重重排查,終于發現了問題,問題出在 Redis 關閉的時候。

server.c/prepareForShutdown 函數的片段如下:

int prepareForShutdown(int flags) {int save = flags & SHUTDOWN_SAVE;int nosave = flags & SHUTDOWN_NOSAVE;/* Create a new RDB file before exiting. */if ((server.saveparamslen > 0 && !nosave) || save) {serverLog(LL_NOTICE,"Saving the final RDB snapshot before exiting.");/* Snapshotting. Perform a SYNC SAVE and exit */rdbSaveInfo rsi, *rsiptr;rsiptr = rdbPopulateSaveInfo(&rsi);if (rdbSave(server.rdb_filename,rsiptr) != C_OK) {serverLog(LL_WARNING,"Error trying to save the DB, can't exit.");return C_ERR;}}
}

準備關閉的時候,在 server.saveparamslen > 0 時,有可能會調用 rdbSave(server.rdb_filename,rsiptr) 生成 rdb 文件。

我們可以在 redis.conf 中設置一些條件讓 Redis 自動執行 BGSAVE 命令,例如:

save 900 1
save 300 10
save 60 10000

server.saveparamslen 就是我們設置的 BGSAVE 保存條件數組的長度,在這個例子中為 3。

于是問題就很清晰了,在 Redis 關閉的時候,它生成了一分 rdb 文件,替換了我拷貝到 B 的 rdb 文件,于是啟動的時候加載的也是它剛生成的這份。

只要我先關閉 Redis,再將 dump.rdb 拷貝到 B,再在 B 啟動 Redis 就可以解決了。

參考資料

  • 《Redis 設計與實現》
  • Redis 5.0.8 server.c/prepareForShutdown

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16529.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16529.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16529.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何將Windows PC變成Wi-Fi熱點?這里提供詳細步驟

序言 Windows 10和Windows 11都有內置功能,可以將你的筆記本電腦(或臺式機)變成無線熱點,允許其他設備連接到它并共享你的互聯網連接。以下是操作指南。 由于Windows中隱藏的虛擬Wi-Fi適配器功能,你甚至可以在連接到另一個Wi-Fi網絡或無線路由器時創建Wi-Fi熱點,通過另…

魯教版七年級數學上冊-筆記

文章目錄 第一章 三角形1 認識三角形2 圖形的全等3 探索三角形全等的條件4 三角形的尺規作圖5 利用三角形全等測距離 第二章 軸對稱1 軸對稱現象2 探索軸對稱的性質4 利用軸對稱進行設計 第三章 勾股定理1 探索勾股定理2 一定是直角三角形嗎3 勾股定理的應用舉例 第四章 實數1 …

實習生在Linux環境下如何日常使用?

那我簡單來說兩個我使用的場景吧 我在搭建我們的測試環境的時候,先上傳jar包到測試環境對應的目錄下,然后呢此時jar包是不可被執行的,所有就有了 chmod x jar包名稱, 接下來,我是用 jps 查看Java的進程,獲取到pid之后…

Kafka 安裝教程和基本操作

一、簡介 Kafka 是最初由 Linkedin 公司開發,是一個分布式、分區的、多副本的、多訂閱者,基于 zookeeper 協調的分布式日志系統(也可以當做 MQ 系統),常見可以用于 web/nginx 日志、訪問日志,消息服務等等…

基于YOLO算法實現網球運動實時分析(附源碼)

大家好,我是小F~ 今天給大家介紹一個計算機視覺實戰的項目。 該項目使用YOLO算法檢測球員和網球,并利用cnn提取球場關鍵點。 進而分析視頻中的網球運動員,測量他們的速度、擊球速度和擊球次數。 使用win10電腦,Python …

【源碼】java + uniapp交易所源代碼/帶搭建教程java交易所/完整源代碼

java uniapp交易所源代碼/帶搭建教程java交易所/完整源代碼 帶簡潔教程,未測 java uniapp交易所源代碼/帶搭建教程java交易所/完整源代碼 - 吾愛資源網

【古董技術】ms-dos應用程序的結構

序 制定一個MS-DOS應用程序計劃需要認真分析程序的大小。這種分析可以幫助程序員確定MS-DOS支持的兩種程序風格中哪一種最適合該應用程序。.EXE程序結構為大型程序提供了好處,因為所有.EXE文件之前都有額外的512字節(或更多)的文件頭。另一方…

C++第十七彈---string使用(下)

?個人主頁: 熬夜學編程的小林 💗系列專欄: 【C語言詳解】 【數據結構詳解】【C詳解】 目錄 1、標準庫中的string類 1.1、string類的常用接口說明 1.1.1、string類對象的修改操作 1.1.2、string類對象非成員函數重載 總結 1、標準庫中的…

牛客熱題:有效括號

📟作者主頁:慢熱的陜西人 🌴專欄鏈接:力扣刷題日記 📣歡迎各位大佬👍點贊🔥關注🚓收藏,🍉留言 文章目錄 牛客熱題:有效括號題目鏈接方法一&#x…

MySQL視圖教程(01):創建視圖

MySQL 創建視圖 在 MySQL 中, CREATE VIEW 語句用于創建一個數據庫視圖(View)。 MySQL 是一種常用的關系型數據庫管理系統,提供了 CREATE VIEW 語法,用于創建視圖(View)。視圖是一種虛擬的表&…

Mycat+Mysql搭建數據集群實現數據分片存儲

前言 MyCAT介紹 * 一個徹底開源的,面向企業應用開發的“大數據庫集群”; * 支持事務、ACID、可以替代MySQL的加強版數據庫; * 一個可以視為“MySQL”集群的企業級數據庫,用來替代昂貴的Oracle集群; * 一個融合內存緩存技術、Nosql技術、HDFS大數據的新型SQL; * 一個新穎…

QCC---DFU升級變更設備名和地址

QCC---DFU升級變更設備名和地址 這個很多人碰到這個疑問,升級了改不了設備名和地址 /******************************************************************************* Copyright (c) 2018 Qualcomm Technologies International, Ltd. FILE NAME sink_dfu_ps.c DESCRIPT…

2024.5.1學習記錄

1、代碼隨想錄:貪心刷題 2、react 高級使用( hoc render、props、函數組件、serState 傳送門等) 3、游山玩水

《拯救大學生課設不掛科第四期之藍橋杯是什么?我是否要參加藍橋杯?選擇何種語言?如何科學備賽?方法思維教程》【官方筆記】

背景: 有些同學在大一或者大二可能會被老師建議參加藍橋杯,本視頻和文章主要是以一個過來人的身份來給與大家一些思路。 比如藍橋杯是什么?我是否要參加藍橋杯?參加藍橋杯該選擇何種語言?如何科學備賽?等…

2023年信息素養大賽小學組C++智能算法復賽試題解析

2023年信息素養大賽小學組C++智能算法復賽真題 智能算法挑戰復賽小學組(總共4道題)T1. 判斷數字出現了幾次 【題目描述】 給定一個正整數 n,判斷從 1 到這個數本身的所有數中,一共出現了多少次數字k。 【輸入格式】 輸入共1行,包括一個正整數n和一個正整數k。(0<n<…

JavaEE之線程(7)_單例模式(設計模式概念、單例模式優點、懶漢、餓漢模式)

一、什么是設計模式&#xff1f; 單例模式是設計模式中較為常見的一種。那么&#xff0c;什么是單例模式&#xff1f; 設計模式&#xff08;Design Pattern&#xff09;都是一些相對優秀的解決方案&#xff0c;很多問題都是典型的、有代表性的問題&#xff0c;學習設計模式&am…

C#面:如果出現ASP.NET中的事件不能觸發可能由于什么原因造成

當 ASP.NET 中的事件不能觸發時&#xff0c;可能由以下幾個原因造成&#xff1a; 事件綁定錯誤&#xff1a;請確保事件正確地綁定到相應的控件上。在 ASP.NET 中&#xff0c;可以通過在前端代碼或者后端代碼中使用事件處理程序來綁定事件。如果事件沒有正確地綁定到控件上&…

為什么本科畢業后我堅定地選擇了就業而不是考研?

大家好&#xff0c;我是小布丁。今天來聊聊我為什么本科畢業后選擇了就業而不是考研。 在整個大學期間&#xff0c;我被親戚拷問最多的問題就是&#xff1a;準備考研嗎&#xff1f;相信很多大學生都遇到過這種情況吧。 如果你說準備還好&#xff0c;親戚大概率就不會問下去&a…

js計算字符串大小存儲所占字節數

在JavaScript中&#xff0c;計算字符串所占的大小&#xff08;占用的字節數&#xff09;并不直接&#xff0c;但可以通過一些方法間接得到。 我們需要知道一個前提&#xff0c;英文字母 lenght 和字節數是一樣的&#xff1a;都是1&#xff0c;而中文 lenght1&#xff0c;字節數…

golang sqlite主從數據同步插件開發

### golang sqlite主從數據同步插件開發思路 參考Mysql的主從同步機制&#xff0c;Mysql是產生binlog&#xff0c;然后把binlog日志同步到從服務上。 同理&#xff0c;我們按sql執行順序記錄所有的增刪改查的sql語句&#xff0c;然后調用接口把sql語句傳到從服務上執行。 數…