Redis持久化_Redis事务_Redis删除策略
Redis持久化
Redis包含3中持久化方案: RDB, AOF, RDB與AOF混合使用
RDB
RDB: 將內(nèi)存中數(shù)據(jù)生成快照形式, 將其保存到.rdb文件中, 關(guān)注點(diǎn)是數(shù)據(jù)
- 使用命令執(zhí)行RDB過程
在保存.rdb文件之前還需要修改redis.conf配置文件, 修改項(xiàng)如下:
- 保存指令
二者執(zhí)行過程如下:
- save執(zhí)行過程
注: redis是單線程, 執(zhí)行save操作的時(shí)候會(huì)造成阻塞問題, 會(huì)嚴(yán)重影響其性能, 通常不使用.
解決刪除上述問題, 使用bgsave指令. - bgsave指令工作原理如下:
bgsave與save的區(qū)別:
- 自動(dòng)執(zhí)行RDB
在redis.conf配置文件中編寫如下配置:
配置redis.conf進(jìn)行rdb操作, 內(nèi)部使用的還是bgsave指令, 執(zhí)行流程如下
注: save需要根據(jù)實(shí)際業(yè)務(wù)情況進(jìn)行配置, save執(zhí)行頻率過高或者過低都會(huì)造成性能問題. save配置中的second與changes通常設(shè)置為互補(bǔ)的關(guān)系, 使用debug reload, shutdown指令會(huì)自動(dòng)執(zhí)行bgsave(如果沒有開啟AOF持久化功能)
- RDB優(yōu)缺點(diǎn)
AOF
AOF: 使用日志的方式記錄redis執(zhí)行的命令, 當(dāng)出現(xiàn)宕機(jī)時(shí), 能盡量避免數(shù)據(jù)丟失的情況, 很好解決了RDB的問題, 但是AOF存在數(shù)據(jù)恢復(fù)較慢的問題.
- AOF執(zhí)行步驟
- AOF寫數(shù)據(jù)的3中策略(AOF寫數(shù)據(jù)也是使用fork處理, 與bgsave一樣)
- AOF相關(guān)配置
- AOF重寫
AOF重寫: 對(duì)同一個(gè)數(shù)據(jù)操作的指令壓縮為一條指令, 解決.aof文件體積過大, 增加磁盤利用率, 提高IO性能.
例: set name A; set name B; set name C; ===> set name C; - AOF重寫方式
注: AOF手動(dòng)重寫過程調(diào)用fork函數(shù), 生成子進(jìn)程, 子進(jìn)程進(jìn)行.aof重寫, 流程與bgsave一樣.
- AOF工作流程:
- AOF重寫流程:
注:
RDB與AOF區(qū)別
| 占用存儲(chǔ)空間 | 小(數(shù)據(jù)壓縮) | 大(數(shù)據(jù)重寫) |
| 存儲(chǔ)速度 | 慢 | 快 |
| 恢復(fù)速度 | 快 | 慢 |
| 數(shù)據(jù)安全性 | 存在數(shù)據(jù)丟失 | 依賴于寫策略 |
| 資源消耗 | 高/重量級(jí) | 低/輕量級(jí) |
| 啟動(dòng)優(yōu)先級(jí) | 低 | 高 |
RDB與AOF的選擇
數(shù)據(jù)敏感: 使用AOF(.aof文件較大, 數(shù)據(jù)恢復(fù)速度慢)
數(shù)據(jù)呈階段性有效: 使用RDB(對(duì)數(shù)據(jù)丟失不敏感, 數(shù)據(jù)恢復(fù)速度快)
綜合比對(duì):
- RDB與AOF的選擇實(shí)際上是在做一種權(quán)衡,每種都有利有弊
- 如不能承受數(shù)分鐘以內(nèi)的數(shù)據(jù)丟失,對(duì)業(yè)務(wù)數(shù)據(jù)非常敏感,選用AOF
- 如能承受數(shù)分鐘以內(nèi)的數(shù)據(jù)丟失,且追求大數(shù)據(jù)集的恢復(fù)速度,選用RDB
- 災(zāi)難恢復(fù)選用RDB
- 雙保險(xiǎn)策略,同時(shí)開啟 RDB 和 AOF,重啟后,Redis優(yōu)先使用 AOF 來恢復(fù)數(shù)據(jù),降低丟失數(shù)據(jù)的量
持久化應(yīng)用場景
Tips 1:redis 應(yīng)用于搶購,限購類、限量發(fā)放優(yōu)惠卷、激活碼等業(yè)務(wù)的數(shù)據(jù)存儲(chǔ)設(shè)計(jì)
Tips 2:redis 應(yīng)用于具有操作先后順序的數(shù)據(jù)控制
Tips 3:redis 應(yīng)用于最新消息展示
Tips 4:redis 應(yīng)用于基于黑名單與白名單設(shè)定的服務(wù)控制
Tips 5:redis 應(yīng)用于計(jì)數(shù)器組合排序功能對(duì)應(yīng)的排名
Tips 6:redis 應(yīng)用于即時(shí)任務(wù)/消息隊(duì)列執(zhí)行管理
Redis事務(wù)
多個(gè)redis-cli操作一個(gè)redis-server就會(huì)存在事務(wù)問題.
- 事務(wù)基本操作
注: multi必須與exec成對(duì)出現(xiàn), 當(dāng)開啟事務(wù)時(shí), 加入事務(wù)的命令都進(jìn)入任務(wù)隊(duì)列中, 當(dāng)執(zhí)行exec指令時(shí), 才將任務(wù)隊(duì)列中的指令取出進(jìn)行執(zhí)行.
注: 若命令隊(duì)列中的命令書寫錯(cuò)誤, 則隊(duì)列中所有的指令都不會(huì)執(zhí)行, 若隊(duì)列中的命令書寫正確但是運(yùn)行錯(cuò)誤(例如: set name A; name不存在), 正確的命令都會(huì)執(zhí)行, 錯(cuò)誤的命令不會(huì)執(zhí)行, 已經(jīng)執(zhí)行完的命令不會(huì)自動(dòng)回滾, 需要在代碼中手動(dòng)實(shí)現(xiàn).
- 手動(dòng)回滾事務(wù)
- 鎖
在執(zhí)行事務(wù)時(shí)為共享資源加鎖, 防止其他redis-cli對(duì)共享資源修改.
事務(wù)執(zhí)行成功:
事務(wù)執(zhí)行失敗, 在該事務(wù)下, 使用另外一個(gè)redis-cli修改list中的值, 當(dāng)該事務(wù)exec, 出現(xiàn)失敗.
- 監(jiān)控具體的數(shù)據(jù)是否被修改(watch只能監(jiān)控key對(duì)應(yīng)value的變化, 不能監(jiān)控具體的數(shù)據(jù))
當(dāng)1號(hào)客戶端設(shè)置lock時(shí), 2號(hào)客戶端對(duì)嘗試修改lock, 但是修改失敗, 說明該lock已經(jīng)存在, 此時(shí)2號(hào)客戶端停止操作.
注: 利用setnx的返回值, 對(duì)于返回設(shè)置成功的, 擁有控制權(quán), 進(jìn)行下一步具體業(yè)務(wù)操作, 對(duì)于返回失敗的, 不具有控制權(quán), 進(jìn)行排隊(duì)或等待.當(dāng)擁有控制的客戶端執(zhí)行完所有操作后, 使用del刪除lock, 此時(shí)另外的客戶端就擁有了資源的控制權(quán).
- 使用expire為lock添加時(shí)間期限, 防止setnx后, 服務(wù)器宕機(jī), lock一直存在, 其他客戶端無法獲取lock進(jìn)行操作
注: 通常操作都是毫秒級(jí)別, 不應(yīng)將鎖定時(shí)間設(shè)置過大, 鎖定時(shí)間設(shè)置=>最大耗時(shí)120%+平均網(wǎng)絡(luò)延遲110%
Redis刪除策略
- redis 所有數(shù)據(jù)放置在內(nèi)存中, 可使用TTL命令獲取數(shù)據(jù)狀態(tài)
- redis expires數(shù)據(jù)分布結(jié)構(gòu):
- 數(shù)據(jù)刪除策略如下:
- 定期刪除
- activeExpireCycle()函數(shù)對(duì)每個(gè)db的expires空間進(jìn)行檢查, 每次執(zhí)行250ms/server.hz
- 檢查一個(gè)expires時(shí), 隨機(jī)挑選w個(gè)key(w = ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP屬性)
- 若key過期, 則刪除key
- 若一輪中刪除的key數(shù)量>=w*25%, 則循環(huán)該過程
- 若一輪中刪除的key數(shù)量<=w*25%, 則進(jìn)入下一個(gè)expires空間
- 使用current_db記錄當(dāng)前activeExpireCycle()進(jìn)入哪一個(gè)expires空間
- 當(dāng)activeExpireCycle()執(zhí)行時(shí)間到了, 下一次的activeExpireCycle執(zhí)行就從current_db開始執(zhí)行
逐出算法
逐出算法: redis執(zhí)行每一個(gè)命令之前, 都調(diào)用freeMemoryIfNeeded()進(jìn)行內(nèi)存檢測, 判斷是否充足, 內(nèi)存不足時(shí), 將臨時(shí)刪除一些數(shù)據(jù), 然后保存新生成的數(shù)據(jù).
逐出算法不能100%成功, 不成功則反復(fù)執(zhí)行, 對(duì)所有數(shù)據(jù)進(jìn)行嘗試后, 若不能達(dá)到清除的要求, 則輸出OOM錯(cuò)誤.
- 逐出算法相關(guān)配置
使用info命令, 查看控制信息, 然后配置逐出策略
總結(jié)
以上是生活随笔為你收集整理的Redis持久化_Redis事务_Redis删除策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: db2 sql执行历史_5 个免费的在线
- 下一篇: Hibernate_2_Hibernat