Redis持久化深度解析:RDB與AOF的終極對(duì)決與實(shí)戰(zhàn)優(yōu)化
引言:一次生產(chǎn)事故引發(fā)的思考
凌晨3點(diǎn),我被一通緊急電話驚醒。線上Redis集群崩潰,6GB的緩存數(shù)據(jù)全部丟失,導(dǎo)致MySQL瞬間承壓暴增,整個(gè)交易系統(tǒng)陷入癱瘓。事后復(fù)盤發(fā)現(xiàn),問題的根源竟是一個(gè)被忽視的持久化配置細(xì)節(jié)。
這次事故讓我深刻意識(shí)到:Redis持久化不僅僅是簡(jiǎn)單的數(shù)據(jù)備份,更是保障系統(tǒng)高可用的關(guān)鍵防線。今天,我將結(jié)合5年的運(yùn)維實(shí)戰(zhàn)經(jīng)驗(yàn),深度剖析Redis的RDB與AOF兩大持久化機(jī)制,幫你避開那些"血淚坑"。
一、為什么Redis持久化如此重要?
1.1 Redis的"阿喀琉斯之踵"
Redis以其極致的性能著稱,但內(nèi)存存儲(chǔ)的特性也帶來了致命弱點(diǎn):
?斷電即失:服務(wù)器宕機(jī)、進(jìn)程崩潰都會(huì)導(dǎo)致數(shù)據(jù)永久丟失
?成本壓力:純內(nèi)存方案成本高昂,1TB內(nèi)存服務(wù)器月租可達(dá)數(shù)萬元
?合規(guī)要求:金融、電商等行業(yè)對(duì)數(shù)據(jù)持久性有嚴(yán)格的監(jiān)管要求
1.2 持久化帶來的價(jià)值
通過合理的持久化策略,我們可以:
? 實(shí)現(xiàn)秒級(jí)RTO(恢復(fù)時(shí)間目標(biāo)),將故障恢復(fù)時(shí)間從小時(shí)級(jí)降至分鐘級(jí)
? 支持跨機(jī)房容災(zāi),構(gòu)建異地多活架構(gòu)
? 滿足數(shù)據(jù)審計(jì)需求,實(shí)現(xiàn)關(guān)鍵操作的追溯回放
二、RDB:簡(jiǎn)單粗暴的快照機(jī)制
2.1 RDB的工作原理
RDB(Redis Database)采用定期快照的方式,將某一時(shí)刻的內(nèi)存數(shù)據(jù)完整地持久化到磁盤。想象一下,這就像給Redis的內(nèi)存狀態(tài)拍了一張"全家福"。
# redis.conf 中的 RDB 配置示例 save 900 1 # 900秒內(nèi)至少1個(gè)key變化則觸發(fā) save 300 10 # 300秒內(nèi)至少10個(gè)key變化則觸發(fā) save 60 10000 # 60秒內(nèi)至少10000個(gè)key變化則觸發(fā) dbfilename dump.rdb # RDB文件名 dir/var/lib/redis # RDB文件存儲(chǔ)路徑 rdbcompressionyes # 開啟壓縮(LZF算法) rdbchecksumyes # 開啟CRC64校驗(yàn) stop-writes-on-bgsave-erroryes# 后臺(tái)保存出錯(cuò)時(shí)停止寫入
2.2 觸發(fā)機(jī)制詳解
RDB持久化有多種觸發(fā)方式,每種都有其適用場(chǎng)景:
# Python示例:監(jiān)控RDB觸發(fā)情況 importredis importtime r = redis.Redis(host='localhost', port=6379) # 手動(dòng)觸發(fā) BGSAVE defmanual_backup(): result = r.bgsave() print(f"后臺(tái)保存已觸發(fā):{result}") # 監(jiān)控保存進(jìn)度 whileTrue: info = r.info('persistence') ifinfo['rdb_bgsave_in_progress'] ==0: print(f"RDB保存完成,耗時(shí):{info['rdb_last_bgsave_time_sec']}秒") break time.sleep(1) print(f"保存中...當(dāng)前進(jìn)度:{info['rdb_current_bgsave_time_sec']}秒") # 獲取RDB統(tǒng)計(jì)信息 defget_rdb_stats(): info = r.info('persistence') stats = { '最后保存時(shí)間': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(info['rdb_last_save_time'])), '最后保存狀態(tài)':'ok'ifinfo['rdb_last_bgsave_status'] =='ok'else'failed', '當(dāng)前保存進(jìn)行中': info['rdb_bgsave_in_progress'] ==1, 'fork耗時(shí)(ms)': info['latest_fork_usec'] /1000 } returnstats
2.3 RDB的優(yōu)勢(shì)與劣勢(shì)
優(yōu)勢(shì):
?恢復(fù)速度快:加載RDB文件比重放AOF日志快10倍以上
?存儲(chǔ)效率高:二進(jìn)制格式+壓縮,文件體積小
?性能影響小:fork子進(jìn)程異步執(zhí)行,主進(jìn)程無阻塞
劣勢(shì):
?數(shù)據(jù)丟失風(fēng)險(xiǎn):最多丟失一個(gè)快照周期的數(shù)據(jù)
?fork開銷大:大內(nèi)存實(shí)例fork可能導(dǎo)致毫秒級(jí)阻塞
2.4 實(shí)戰(zhàn)優(yōu)化技巧
# 1. 避免頻繁全量備份導(dǎo)致的IO壓力 # 錯(cuò)誤示例:生產(chǎn)環(huán)境不要這樣配置! save 10 1 # 每10秒只要有1個(gè)key變化就備份 # 2. 合理設(shè)置備份策略 # 推薦配置:根據(jù)業(yè)務(wù)特點(diǎn)調(diào)整 save 3600 1 # 1小時(shí)內(nèi)至少1次變更 save 300 100 # 5分鐘內(nèi)至少100次變更 save 60 10000 # 1分鐘內(nèi)至少10000次變更 # 3. 利用主從復(fù)制減少主庫(kù)壓力 # 在從庫(kù)上執(zhí)行RDB備份 redis-cli -h slave_host CONFIG SET save"900 1"
三、AOF:精確到每一條命令的日志
3.1 AOF的核心機(jī)制
AOF(Append Only File)通過記錄每一條寫命令來實(shí)現(xiàn)持久化,類似MySQL的binlog。這種方式可以最大程度地減少數(shù)據(jù)丟失。
# AOF 核心配置 appendonlyyes # 開啟AOF appendfilename"appendonly.aof" # AOF文件名 appendfsync everysec # 每秒同步一次(推薦) # appendfsync always # 每次寫入都同步(最安全但最慢) # appendfsync no # 由操作系統(tǒng)決定(最快但最不安全) no-appendfsync-on-rewrite no # 重寫時(shí)是否暫停同步 auto-aof-rewrite-percentage 100 # 文件增長(zhǎng)100%時(shí)觸發(fā)重寫 auto-aof-rewrite-min-size 64mb # AOF文件最小重寫大小
3.2 AOF重寫機(jī)制深度剖析
AOF文件會(huì)不斷增長(zhǎng),重寫機(jī)制通過生成等效的最小命令集來壓縮文件:
# 模擬AOF重寫過程 classAOFRewriter: def__init__(self): self.commands = [] self.data = {} defrecord_command(self, cmd): """記錄原始命令""" self.commands.append(cmd) # 模擬執(zhí)行命令 ifcmd.startswith("SET"): parts = cmd.split() self.data[parts[1]] = parts[2] elifcmd.startswith("INCR"): key = cmd.split()[1] self.data[key] =str(int(self.data.get(key,0)) +1) defrewrite(self): """生成優(yōu)化后的命令集""" optimized = [] forkey, valueinself.data.items(): optimized.append(f"SET{key}{value}") returnoptimized # 示例:優(yōu)化前后對(duì)比 rewriter = AOFRewriter() original_commands = [ "SET counter 0", "INCR counter", "INCR counter", "INCR counter", "SET name redis", "SET name Redis6.0" ] forcmdinoriginal_commands: rewriter.record_command(cmd) print(f"原始命令數(shù):{len(original_commands)}") print(f"優(yōu)化后命令數(shù):{len(rewriter.rewrite())}") print(f"壓縮率:{(1-len(rewriter.rewrite())/len(original_commands))*100:.1f}%")
3.3 AOF的三種同步策略對(duì)比
#!/bin/bash # 性能測(cè)試腳本:對(duì)比不同fsync策略 echo"測(cè)試環(huán)境準(zhǔn)備..." redis-cli FLUSHDB > /dev/null strategies=("always""everysec""no") forstrategyin"${strategies[@]}";do echo"測(cè)試 appendfsync =$strategy" redis-cli CONFIG SET appendfsync$strategy> /dev/null # 使用redis-benchmark測(cè)試 result=$(redis-benchmark -tset-n 100000 -q) echo"$result"| grep"SET" # 檢查實(shí)際持久化情況 sync_count=$(grep -c"sync"/var/log/redis/redis.log |tail-1) echo"同步次數(shù):$sync_count" echo"---" done
3.4 AOF優(yōu)化實(shí)踐
-- Lua腳本:批量操作優(yōu)化AOF記錄 -- 將多個(gè)命令合并為一個(gè)原子操作,減少AOF條目 localprefix = KEYS[1] localcount =tonumber(ARGV[1]) localvalue = ARGV[2] localresults = {} fori =1, countdo localkey = prefix ..':'.. i redis.call('SET', key, value) table.insert(results, key) end returnresults
四、RDB vs AOF:如何選擇?
4.1 核心指標(biāo)對(duì)比
指標(biāo) | RDB | AOF |
數(shù)據(jù)安全性 | 較低(可能丟失分鐘級(jí)數(shù)據(jù)) | 高(最多丟失1秒數(shù)據(jù)) |
恢復(fù)速度 | 快(直接加載二進(jìn)制) | 慢(需要重放所有命令) |
文件體積 | 小(壓縮后的二進(jìn)制) | 大(文本格式命令日志) |
性能影響 | 周期性fork開銷 | 持續(xù)的磁盤IO |
適用場(chǎng)景 | 數(shù)據(jù)分析、緩存 | 消息隊(duì)列、計(jì)數(shù)器 |
4.2 混合持久化:魚和熊掌兼得
Redis 4.0引入的混合持久化結(jié)合了兩者優(yōu)勢(shì):
# 開啟混合持久化 aof-use-rdb-preambleyes # 工作原理: # 1. AOF重寫時(shí),先生成RDB格式的基礎(chǔ)數(shù)據(jù) # 2. 后續(xù)增量命令以AOF格式追加 # 3. 恢復(fù)時(shí)先加載RDB部分,再重放AOF增量
4.3 實(shí)戰(zhàn)選型決策樹
defchoose_persistence_strategy(requirements): """根據(jù)業(yè)務(wù)需求推薦持久化策略""" ifrequirements['data_loss_tolerance'] <=?1: ?# 秒級(jí) ? ? ? ??if?requirements['recovery_time'] <=?60: ? ?# 1分鐘內(nèi)恢復(fù) ? ? ? ? ? ??return"混合持久化 (RDB+AOF)" ? ? ? ??else: ? ? ? ? ? ??return"AOF everysec" ? ?? ? ??elif?requirements['data_loss_tolerance'] <=?300: ?# 5分鐘 ? ? ? ??if?requirements['memory_size'] >=32: # GB return"RDB + 從庫(kù)AOF" else: return"RDB (save 300 10)" else: # 可容忍較大數(shù)據(jù)丟失 return"RDB (save 3600 1)" # 示例:電商訂單緩存 order_cache_req = { 'data_loss_tolerance':60, # 可容忍60秒數(shù)據(jù)丟失 'recovery_time':30, # 要求30秒內(nèi)恢復(fù) 'memory_size':16 # 16GB內(nèi)存 } print(f"推薦方案:{choose_persistence_strategy(order_cache_req)}")
五、生產(chǎn)環(huán)境最佳實(shí)踐
5.1 監(jiān)控告警體系
# 持久化監(jiān)控指標(biāo)采集 importredis importtime fromdatetimeimportdatetime classPersistenceMonitor: def__init__(self, redis_client): self.redis = redis_client self.alert_thresholds = { 'rdb_last_save_delay':3600, # RDB超過1小時(shí)未保存 'aof_rewrite_delay':7200, # AOF超過2小時(shí)未重寫 'aof_size_mb':1024, # AOF文件超過1GB 'fork_time_ms':1000 # fork時(shí)間超過1秒 } defcheck_health(self): """健康檢查并返回告警""" alerts = [] info =self.redis.info('persistence') # 檢查RDB狀態(tài) last_save_delay = time.time() - info['rdb_last_save_time'] iflast_save_delay >self.alert_thresholds['rdb_last_save_delay']: alerts.append({ 'level':'WARNING', 'message':f'RDB已{last_save_delay/3600:.1f}小時(shí)未保存' }) # 檢查AOF大小 ifinfo.get('aof_enabled'): aof_size_mb = info['aof_current_size'] /1024/1024 ifaof_size_mb >self.alert_thresholds['aof_size_mb']: alerts.append({ 'level':'WARNING', 'message':f'AOF文件過大:{aof_size_mb:.1f}MB' }) returnalerts # 使用示例 monitor = PersistenceMonitor(redis.Redis()) alerts = monitor.check_health() foralertinalerts: print(f"[{alert['level']}]{alert['message']}")
5.2 備份恢復(fù)演練
#!/bin/bash # 自動(dòng)化備份恢復(fù)測(cè)試腳本 REDIS_HOST="localhost" REDIS_PORT="6379" BACKUP_DIR="/data/redis-backup" TEST_KEY="backup$(date +%s)" # 1. 寫入測(cè)試數(shù)據(jù) echo"寫入測(cè)試數(shù)據(jù)..." redis-cli SET$TEST_KEY"test_value"EX 3600 # 2. 執(zhí)行備份 echo"執(zhí)行BGSAVE..." redis-cli BGSAVE sleep5 # 3. 備份文件 cp/var/lib/redis/dump.rdb$BACKUP_DIR/dump_$(date+%Y%m%d_%H%M%S).rdb # 4. 模擬數(shù)據(jù)丟失 redis-cli DEL$TEST_KEY # 5. 恢復(fù)數(shù)據(jù) echo"停止Redis..." systemctl stop redis echo"恢復(fù)備份..." cp$BACKUP_DIR/dump_*.rdb /var/lib/redis/dump.rdb echo"啟動(dòng)Redis..." systemctl start redis # 6. 驗(yàn)證恢復(fù) ifredis-cli GET$TEST_KEY| grep -q"test_value";then echo"? 備份恢復(fù)成功" else echo"? 備份恢復(fù)失敗" exit1 fi
5.3 容量規(guī)劃與優(yōu)化
# 持久化容量評(píng)估工具 classPersistenceCapacityPlanner: def__init__(self, daily_writes, avg_key_size, avg_value_size): self.daily_writes = daily_writes self.avg_key_size = avg_key_size self.avg_value_size = avg_value_size defestimate_aof_growth(self, days=30): """估算AOF文件增長(zhǎng)""" # 每條命令約占用: SET key value cmd_size =6+self.avg_key_size +self.avg_value_size daily_growth_mb = (self.daily_writes * cmd_size) /1024/1024 # 考慮重寫壓縮率約60% after_rewrite = daily_growth_mb *0.4 return{ 'daily_growth_mb': daily_growth_mb, 'monthly_size_mb': after_rewrite * days, 'recommended_rewrite_size_mb': daily_growth_mb *2 } defestimate_rdb_size(self, total_keys): """估算RDB文件大小""" # RDB壓縮率通常在30-50% raw_size = total_keys * (self.avg_key_size +self.avg_value_size) compressed_size_mb = (raw_size *0.4) /1024/1024 return{ 'estimated_size_mb': compressed_size_mb, 'backup_time_estimate_sec': compressed_size_mb /100# 假設(shè)100MB/s } # 使用示例 planner = PersistenceCapacityPlanner( daily_writes=10_000_000, # 日寫入1000萬次 avg_key_size=20, avg_value_size=100 ) aof_estimate = planner.estimate_aof_growth() print(f"AOF日增長(zhǎng):{aof_estimate['daily_growth_mb']:.1f}MB") print(f"建議重寫閾值:{aof_estimate['recommended_rewrite_size_mb']:.1f}MB")
六、踩坑經(jīng)驗(yàn)與故障案例
6.1 案例一:fork阻塞導(dǎo)致的雪崩
問題描述:32GB內(nèi)存的Redis實(shí)例,執(zhí)行BGSAVE時(shí)主線程阻塞3秒,導(dǎo)致大量請(qǐng)求超時(shí)。
根因分析:
? Linux的fork采用COW(寫時(shí)復(fù)制)機(jī)制
? 需要復(fù)制頁(yè)表,32GB約需要64MB頁(yè)表
? 在內(nèi)存壓力大時(shí),分配頁(yè)表內(nèi)存耗時(shí)增加
解決方案:
# 1. 開啟大頁(yè)內(nèi)存,減少頁(yè)表項(xiàng) echonever > /sys/kernel/mm/transparent_hugepage/enabled # 2. 調(diào)整內(nèi)核參數(shù) sysctl -w vm.overcommit_memory=1 # 3. 錯(cuò)峰執(zhí)行持久化 redis-cli CONFIG SET save""# 禁用自動(dòng)RDB # 通過crontab在業(yè)務(wù)低峰期手動(dòng)觸發(fā) 0 3 * * * redis-cli BGSAVE
6.2 案例二:AOF重寫死循環(huán)
問題描述:AOF文件達(dá)到5GB后觸發(fā)重寫,但重寫期間新增數(shù)據(jù)量大于重寫壓縮量,導(dǎo)致重寫永遠(yuǎn)無法完成。
解決方案:
-- 限流腳本:重寫期間降低寫入速度 localcurrent = redis.call('INFO','persistence') ifstring.match(current,'aof_rewrite_in_progress:1')then -- AOF重寫中,限制寫入 localkey = KEYS[1] locallimit =tonumber(ARGV[1]) localcurrent_qps = redis.call('INCR','qps_counter') ifcurrent_qps > limitthen return{err ='系統(tǒng)繁忙,請(qǐng)稍后重試'} end end -- 正常執(zhí)行業(yè)務(wù)邏輯 returnredis.call('SET', KEYS[1], ARGV[2])
6.3 案例三:混合持久化的版本兼容問題
問題描述:從Redis 5.0降級(jí)到4.0時(shí),無法識(shí)別混合格式的AOF文件。
預(yù)防措施:
# 版本兼容性檢查工具 importstruct defcheck_aof_format(filepath): """檢查AOF文件格式""" withopen(filepath,'rb')asf: header = f.read(9) ifheader.startswith(b'REDIS'): # RDB格式頭部 version = struct.unpack('bbbbbbbb', header[5:]) returnf"混合格式 (RDB v{version})" elifheader.startswith(b'*'): # 純AOF格式 return"純AOF格式" else: return"未知格式" # 遷移前檢查 aof_format = check_aof_format('/var/lib/redis/appendonly.aof') print(f"當(dāng)前AOF格式:{aof_format}") if"混合"inaof_format: print("警告: 目標(biāo)版本可能不支持混合格式,建議先執(zhí)行BGREWRITEAOF")
七、性能調(diào)優(yōu)實(shí)戰(zhàn)
7.1 基準(zhǔn)測(cè)試與調(diào)優(yōu)
#!/bin/bash # 持久化性能基準(zhǔn)測(cè)試 echo"=== 持久化性能基準(zhǔn)測(cè)試 ===" # 測(cè)試1: 無持久化 redis-cli CONFIG SET save"" redis-cli CONFIG SET appendonly no echo"場(chǎng)景1: 無持久化" redis-benchmark -tset,get -n 1000000 -q # 測(cè)試2: 僅RDB redis-cli CONFIG SET save"60 1000" redis-cli CONFIG SET appendonly no echo"場(chǎng)景2: 僅RDB" redis-benchmark -tset,get -n 1000000 -q # 測(cè)試3: 僅AOF (everysec) redis-cli CONFIG SET save"" redis-cli CONFIG SET appendonlyyes redis-cli CONFIG SET appendfsync everysec echo"場(chǎng)景3: AOF everysec" redis-benchmark -tset,get -n 1000000 -q # 測(cè)試4: RDB+AOF redis-cli CONFIG SET save"60 1000" redis-cli CONFIG SET appendonlyyes echo"場(chǎng)景4: RDB+AOF" redis-benchmark -tset,get -n 1000000 -q
7.2 持久化與內(nèi)存優(yōu)化
# 內(nèi)存碎片與持久化關(guān)系分析 defanalyze_memory_fragmentation(redis_client): """分析內(nèi)存碎片對(duì)持久化的影響""" info = redis_client.info('memory') fragmentation_ratio = info['mem_fragmentation_ratio'] used_memory_gb = info['used_memory'] /1024/1024/1024 recommendations = [] iffragmentation_ratio >1.5: recommendations.append({ 'issue':'內(nèi)存碎片率過高', 'impact':f'RDB文件可能增大{(fragmentation_ratio-1)*100:.1f}%', 'solution':'考慮執(zhí)行內(nèi)存整理: MEMORY PURGE' }) ifused_memory_gb >16andfragmentation_ratio >1.2: fork_time_estimate = used_memory_gb *100# ms recommendations.append({ 'issue':'大內(nèi)存+高碎片', 'impact':f'fork預(yù)計(jì)阻塞{fork_time_estimate:.0f}ms', 'solution':'建議使用主從架構(gòu),在從節(jié)點(diǎn)執(zhí)行持久化' }) returnrecommendations
八、未來展望與新特性
8.1 Redis 7.0的持久化改進(jìn)
Redis 7.0帶來了多項(xiàng)持久化優(yōu)化:
1.增量RDB快照:只保存變更的數(shù)據(jù)頁(yè),大幅減少IO
2.AOF時(shí)間戳記錄:支持按時(shí)間點(diǎn)恢復(fù)(PITR)
3.多線程持久化:利用多核CPU加速RDB生成
8.2 云原生時(shí)代的持久化策略
在Kubernetes環(huán)境下,持久化策略需要重新思考:
# Redis StatefulSet with 持久化配置 apiVersion:apps/v1 kind:StatefulSet metadata: name:redis-cluster spec: volumeClaimTemplates: -metadata: name:redis-data spec: accessModes:["ReadWriteOnce"] storageClassName:"fast-ssd" resources: requests: storage:100Gi template: spec: containers: -name:redis image:redis:7.0 volumeMounts: -name:redis-data mountPath:/data command: -redis-server ---save9001 ---appendonlyyes ---appendfsynceverysec
結(jié)語(yǔ):持久化的平衡藝術(shù)
Redis持久化不是非黑即白的選擇題,而是需要根據(jù)業(yè)務(wù)特點(diǎn)精心權(quán)衡的平衡藝術(shù)。記住這幾個(gè)核心原則:
1.沒有銀彈:RDB快但可能丟數(shù)據(jù),AOF安全但恢復(fù)慢
2.監(jiān)控先行:建立完善的監(jiān)控體系,及時(shí)發(fā)現(xiàn)問題
3.演練常態(tài)化:定期進(jìn)行故障演練,驗(yàn)證恢復(fù)流程
4.與時(shí)俱進(jìn):關(guān)注Redis新版本特性,適時(shí)升級(jí)優(yōu)化
最后,回到文章開頭的生產(chǎn)事故,我們最終采用了混合持久化+主從架構(gòu)的方案,將RTO從4小時(shí)縮短到5分鐘,RPO從6小時(shí)縮短到1秒。技術(shù)選型沒有對(duì)錯(cuò),只有適合與否。
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3155瀏覽量
75858 -
集群
+關(guān)注
關(guān)注
0文章
129瀏覽量
17553 -
Redis
+關(guān)注
關(guān)注
0文章
390瀏覽量
11851
原文標(biāo)題:Redis持久化深度解析:RDB與AOF的終極對(duì)決與實(shí)戰(zhàn)優(yōu)化
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Redis持久化機(jī)制的實(shí)現(xiàn)原理和使用技巧
談?wù)?b class='flag-5'>Redis怎樣配置實(shí)現(xiàn)主從復(fù)制?
Redis持久化分為兩種:RDB和AOF
redis持久化方式有幾種及配置
redis兩種持久化方式的區(qū)別
redis的持久化方式RDB和AOF的區(qū)別
redis持久化機(jī)制和如何實(shí)現(xiàn)持久化
redis持久化機(jī)制優(yōu)缺點(diǎn)
redis里數(shù)據(jù)什么時(shí)候持久化
云容器redis持久化配置
redis持久化rdb和aof一起用好處
Redis使用重要的兩個(gè)機(jī)制:Reids持久化和主從復(fù)制

評(píng)論