Redis数据持久化机制AOF原理分析之配置详解
本文所引用的源码全部来自Redis2.8.2版本。 Redis的配置文件为redis.conf, 对配置文件的解析代码见config.c 原创文章转载请注明,本文来自http://blog.csdn.net/acceptedxukai/article/details/18135219 AOF实现机制简介 AOF 即Append Only File,实现机制:R
本文所引用的源码全部来自Redis2.8.2版本。
Redis的配置文件为redis.conf, 对配置文件的解析代码见config.c
原创文章转载请注明,本文来自http://blog.csdn.net/acceptedxukai/article/details/18135219
AOF实现机制简介
AOF 即Append Only File,实现机制:Redis将数据库做个快照,遍历所有数据库,将数据库中的数据还原为跟客户端发送来的指令的协议格式的字符串,然后Redis新建一个临时文件将这些快照数据保存,待快照程序结束后将临时文件名修改为正常的aof文件名,原有的文件则自动丢弃,由于在快照进行的过程中可能存在新增的命令修改了数据库中的数据,则在快照程序结束后需要将新修改的数据追加到aof文件中,后续的从客户端过来的命令都会不断根据不同的安全级别写到磁盘里面去。这样就支持了实时的持久化,只是可能会有短时间内的数据丢失,对一般系统还是可以容忍的。
配置文件redis.conf中有关AOF参数配置解释
appendonly
含义:Redis Server是否开启AOF持久化机制
在config.c函数loadServerConfigFromString解析代码为
if (!strcasecmp(argv[0],"appendonly") && argc == 2) { int yes; if ((yes = yesnotoi(argv[1])) == -1) { err = "argument must be 'yes' or 'no'"; goto loaderr; } server.aof_state = yes ? REDIS_AOF_ON : REDIS_AOF_OFF; }
appendfsync
含义:Redis将OS数据缓冲区中数据刷新到磁盘的策略
# appendfsync always 只要有新添加的数据就fsync
appendfsync everysec 支持延迟fsync
# appendfsync no 不需要fsync
config.c中解析代码
if (!strcasecmp(argv[0],"appendfsync") && argc == 2) {//AOF fsync策略 if (!strcasecmp(argv[1],"no")) { server.aof_fsync = AOF_FSYNC_NO; } else if (!strcasecmp(argv[1],"always")) { server.aof_fsync = AOF_FSYNC_ALWAYS; } else if (!strcasecmp(argv[1],"everysec")) { server.aof_fsync = AOF_FSYNC_EVERYSEC; } else { err = "argument must be 'no', 'always' or 'everysec'"; goto loaderr; } }
no-appendfsync-on-rewrite
含义:当rewrite AOF子进程或RDB子进程正在执行时,Server是否支持fsync,即当新修改的数据写入AOF文件后,是否将数据刷新到硬盘
config.c中解析代码
if (!strcasecmp(argv[0],"no-appendfsync-on-rewrite") && argc == 2) { if ((server.aof_no_fsync_on_rewrite= yesnotoi(argv[1])) == -1) { err = "argument must be 'yes' or 'no'"; goto loaderr; } }
server.aof_no_fsync_on_rewrite控制该机制的实现代码在aof.c的flushAppendOnlyFile函数中,具体代码为
//如果不支持fsync,或者aof rdb子进程正在运行,那么直接返回, //但是数据已经写到aof文件中,只是没有刷新到硬盘 if (server.aof_no_fsync_on_rewrite && (server.aof_child_pid != -1 || server.rdb_child_pid != -1)) return;
appendfilename
含义:AOF的文件名
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
这两个配置就暂不解释,见下面redisServer结构体中中有关AOF参数的注释
redisServer数据结构中有关AOF的参数
struct redisServer { ………… /* AOF persistence */ int aof_state; /* REDIS_AOF_(ON|OFF|WAIT_REWRITE) */ int aof_fsync; /* Kind of fsync() policy */ char *aof_filename; /* Name of the AOF file */ int aof_no_fsync_on_rewrite; /* Don't fsync if a rewrite is in prog. */ int aof_rewrite_perc; /* Rewrite AOF if % growth is > M and... */ off_t aof_rewrite_min_size; /* the AOF file is at least N bytes. */ aof文件最小字节数 off_t aof_rewrite_base_size; /* AOF size on latest startup or rewrite. */ 上一次aof文件的大小 off_t aof_current_size; /* AOF current size. */ 当前aof文件的大小 int aof_rewrite_scheduled; /* Rewrite once BGSAVE terminates. */ pid_t aof_child_pid; /* PID if rewriting process */ 子进程的pid list *aof_rewrite_buf_blocks; /* Hold changes during an AOF rewrite. */ sds aof_buf; /* AOF buffer, written before entering the event loop */ int aof_fd; /* File descriptor of currently selected AOF file */ aof文件描述符 int aof_selected_db; /* Currently selected DB in AOF */ time_t aof_flush_postponed_start; /* UNIX time of postponed AOF flush */ time_t aof_last_fsync; /* UNIX time of last fsync() */ time_t aof_rewrite_time_last; /* Time used by last AOF rewrite run. */ time_t aof_rewrite_time_start; /* Current AOF rewrite start time. */ int aof_lastbgrewrite_status; /* REDIS_OK or REDIS_ERR */ unsigned long aof_delayed_fsync; /* delayed AOF fsync() counter */ int aof_rewrite_incremental_fsync;/* fsync incrementally while rewriting? */ ………… }
字符串aof_buf与链表aof_rewrite_buf_blocks分别是追加AOF文件与rewrite AOF文件后处理差异数据的重要参数
initServerConfig函数对AOF参数的初始化及注释
server.aof_state = REDIS_AOF_OFF; //AOF文件是否开启 server.aof_fsync = REDIS_DEFAULT_AOF_FSYNC; //fsync策略,默认为每秒fsync server.aof_no_fsync_on_rewrite = REDIS_DEFAULT_AOF_NO_FSYNC_ON_REWRITE;//aof rdb子进程运行中是否支持fsync,即写入AOF文件后,将数据刷新到硬盘 server.aof_rewrite_perc = REDIS_AOF_REWRITE_PERC; //自动rewrite增量值 server.aof_rewrite_min_size = REDIS_AOF_REWRITE_MIN_SIZE; //AOF文件最小字节数 server.aof_rewrite_base_size = 0; //自动rewrite计算aof文件增量的基数,等于上一次aof文件的字节数 server.aof_rewrite_scheduled = 0; //rewrite任务计划,当客户端发送bgrewriteaof指令,如果当前rewrite子进程正在执行,那么将客户端请求的bgrewriteaof变为计划任务,待AOF子进程结束后执行rewrite server.aof_last_fsync = time(NULL); //最近fsync数据到硬盘时间 server.aof_rewrite_time_last = -1; //rewrite持续的时间 server.aof_rewrite_time_start = -1; //rewrite开始的时间 server.aof_lastbgrewrite_status = REDIS_OK; //rewrite后的状态 server.aof_delayed_fsync = 0; //延迟fsync到硬盘的次数 server.aof_fd = -1; //AOF文件描述符 server.aof_selected_db = -1; /* Make sure the first time will not match */ server.aof_flush_postponed_start = 0; //上次推迟fsync到硬盘的时间 server.aof_rewrite_incremental_fsync = REDIS_DEFAULT_AOF_REWRITE_INCREMENTAL_FSYNC;//rewrite AOF文件时是否采用增量式fsync
其中aof_current_size参数未初始化,该值的初始化在Server启动加载AOF文件数据时初始化。
小结
本文就是简单介绍Redis中有关AOF机制实现的相关参数的意义,方便对接下来AOF数据持久化机制的理解,AOF机制的实现比较复杂,大致分为Server启动加载AOF文件数据、将新的数据追加到AOF文件中、自动rewrite AOF文件、客户端请求BGREWRITEAOF指令四个部分,下面的博客将介绍这三个部分的实现。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

在Debian系統中,readdir系統調用用於讀取目錄內容。如果其性能表現不佳,可嘗試以下優化策略:精簡目錄文件數量:盡可能將大型目錄拆分成多個小型目錄,降低每次readdir調用處理的項目數量。啟用目錄內容緩存:構建緩存機制,定期或在目錄內容變更時更新緩存,減少對readdir的頻繁調用。內存緩存(如Memcached或Redis)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信
