基礎
特性:速度快/基于kv結構/功能穩(wěn)定/持久化/高可用
基本類型:字符串/列表/hash/集合/有序集合
速度快原因:單線程/基于內存的操作/epollo模型
memcached對比:1.支持更多數(shù)據(jù)類型2.數(shù)據(jù)持久化3.文件大小限制 redis 512G4.redis單進程mc多進程
遍歷:keys 遍歷所有 scan漸進式遍歷
3種移動key的方式 move,dump/restore,migrate
擴展應用
lua
通過eval和evalsha(加載到服務端執(zhí)行)執(zhí)行l(wèi)ua腳本
好處:1.lua腳本在redis是原子操作不插入其他命令2.可以擴展redis功能3.多條命令打包減少開銷
pipeline
1.批量執(zhí)行2.非原子性3.只能操作一個實例4.使用時避免過大堵塞
事務
1.使用multi和exec執(zhí)行事務2.命令是原子順序執(zhí)行3.事務不支持回滾
持久化
AOF
使用日志記錄每次的命令靶衍,重啟后再執(zhí)行AOF中的命令恢復數(shù)據(jù),解決數(shù)據(jù)持久化的實時性。使用文本協(xié)議保存董瞻。也可以手動和自動觸發(fā)命令暂吉。redis啟動時優(yōu)先判斷AOF文件是否存在
重寫文件變幸靖啊:1.過期數(shù)據(jù)不再寫入2.去除無效命令只保存最終結果3.多條命令合并成一個
RDB
定義:把當前進程數(shù)據(jù)生成快照保存到硬盤诡延,可以手動和自動觸發(fā)鉴象。bgsave(子進程方式)非阻塞 save阻塞忙菠。
優(yōu)點:1.緊湊二進制文件,適合備份 2.加載RDB速度比AOF快
缺點:1.不能做到實時/秒級持久化2.新老版本格式不一致不容易兼容
內存管理
回收策略(刪除過期時間的鍵)
惰性刪除:過期對象被使用時才刪除纺弊,可能存在內存泄露
定時任務掃描:每秒運行10次牛欢,使用快慢兩種方式回收鍵
內存溢出控制:1.拒絕寫入2.最近最少使用3.隨機刪除所有鍵等
使用優(yōu)化:1.縮減key和value的大小 2.使用共享對象池(LRU相關淘汰策略無效,只支持整數(shù)對象池)3.避免頻繁操作減少碎片
碎片產生的原因:頻繁append setrang等
高可用
主從復制
配置從節(jié)點同步數(shù)據(jù)淆游,支持樹狀結構復制傍睹。
主從節(jié)點維護心跳和偏移量監(jiān)測保證通訊和數(shù)據(jù)一致
哨兵
能夠實現(xiàn)高可用,實現(xiàn)故障發(fā)現(xiàn)稽犁,故障轉移,客戶端通知骚亿。在對節(jié)點做失敗判斷時分為主觀下線和客觀下線(Page:257)已亥。
集群(Redis Cluster)
實現(xiàn)原理:使用哈希分布,一致性哈希通過哈希環(huán)實現(xiàn)来屠。哈希槽0-16383
集群功能限制:1.key批量操作支持有限(mset/mget)虑椎,因為分配到不同的槽中2.事務操作的限制3.不支持多數(shù)據(jù)庫空間 4.復制結構只能一層
緩存設計
更新策略
LRU/LRF/FIFO算法
超時剔除
主動更新
穿透優(yōu)化
緩存空對象震鹉,并設置一定過期時間
布隆過濾器(對有效key的驗證)
雪崩
保持高可用
使用組件限流降級
熱點key優(yōu)化
互斥更新value
不過期
異步更新策略
進階
bigkeys
危害:內存空間不均衡,超時捆姜,網絡堵塞
如何發(fā)現(xiàn):redis_cli --bigkeys,被動收集/scan + debug object主動發(fā)現(xiàn)
惰性刪除:lazy delete free 異步操作传趾,不會堵塞
實現(xiàn)原理
string
raw(動態(tài)字符串編碼)
embstr(優(yōu)化內存分配的字符串編碼)
int(整數(shù)編碼)
hash
hashtable
ziplist(壓縮列表)
list
linkedlist(雙向鏈表)
ziplist(壓縮列表)
quicklist
set
hashtable
intset(整數(shù)集合編碼)
zset
ziplist(壓縮列表)
skiplist(跳躍表)
底層實現(xiàn)
ziplist(壓縮表):https://www.kancloud.cn/kancloud/redisbook/63856
skiplist(跳躍表):字典保存member到score的映射∧嗉迹基于鏈表按照score從小到大排列浆兰,增加跳躍功能,新增加數(shù)據(jù)時候會隨機分層珊豹。跳表保存key用于排序和范圍查找
intset(整數(shù)集合編碼) https://www.kancloud.cn/kancloud/redisbook/63849
阻塞
導致阻塞的原因:數(shù)據(jù)類型使用不合理簸呈,持久化阻塞,cpu飽和店茶,網絡等問題
對應幾個解決方法:慢日志蜕便,關注CPU使用率,禁止不合理使用命令 keys,sort等