最近上海大事件,seo手機(jī)關(guān)鍵詞網(wǎng)址,阜陽網(wǎng)站建設(shè)費(fèi)用,中央人民政府網(wǎng)站官網(wǎng)第一部分:Redis基礎(chǔ)知識點(diǎn)
1、數(shù)據(jù)類型 5種常用基礎(chǔ)類型:string,hash,list,set,zset – 字符串,Hash表,List順序集合,Set無序集合,ZSet有序集合3中特殊類型:bitmap-字節(jié)地圖, hyperloglog-統(tǒng)計(jì)…第一部分:Redis基礎(chǔ)知識點(diǎn)
- 1、數(shù)據(jù)類型
- 5種常用基礎(chǔ)類型:string,hash,list,set,zset – 字符串,Hash表,List順序集合,Set無序集合,ZSet有序集合
- 3中特殊類型:bitmap-字節(jié)地圖, hyperloglog-統(tǒng)計(jì)日志,geospatial-地理位置計(jì)算
- 2、底層數(shù)據(jù)結(jié)構(gòu)
- String: 基于SDS字典結(jié)構(gòu)
- Hash表 : 由zipList/quickList組成,底層有Dict保存
- List集合: 基于LinkedList數(shù)據(jù)接口的ZipList和QuickList結(jié)構(gòu)
- Set集合: intSet和Dict組合,其中Dict由Hashtable和DictEntry和Dict組成
- ZSet集合:HashTable+SkipList+IntSet
- 說明:
- ZipList壓縮表用于當(dāng)元素?cái)?shù)量小于128時(shí),用于對集合壓縮,減少內(nèi)存占用,但是雖節(jié)省內(nèi)存但是需要連續(xù)空間,會造成內(nèi)存碎片
- QuickList則在ZipList上使用LinkedList來避免申請連續(xù)空間,減少內(nèi)存碎片產(chǎn)生
- SkipList跳表則是采用類似于加索引方式,提升查詢效率
- 3、持久化方式
- rdb快照模式, 數(shù)據(jù)恢復(fù)快,效率高,但是會丟失數(shù)據(jù)
- aof命令拼接模式:數(shù)據(jù)恢復(fù)慢,效率低,數(shù)據(jù)安全
- 常用RDB+AOF結(jié)合方式。
- 4、內(nèi)存淘汰策略
- allkey-lru,allkey-lfu,allkey-random,nonvice,volite-lru,volite-lfu,volite-ttl
- LRU算法:最近最少使用,
- 底層原理基于HashTable+LinkedList即Hash表和雙向鏈表實(shí)現(xiàn)
- 即HashTable用于快速查找,LinkedList采用后進(jìn)先出方式,保證最近訪問的放在前面,只淘汰尾部即可
- LFU算法:最近不頻繁使用
- 底層原理使用RedisObject的lru字段的后半部分保存訪問的次數(shù)
- TTL算法:對于設(shè)置了存活時(shí)間(TTL)的key,TTL值越小,越先淘汰
- Random算法 :隨機(jī)算法
- 5、集群方式
- 主從模式,哨兵模式,代理分片模式,redis-cluster模式
- 6、redis常見問題
- 緩存雪崩,緩存穿透,緩存擊穿,bigkey,hotkey,雙寫一致性
- 7、redis特性
- 內(nèi)存,單線程模型,多路復(fù)用,epoll
- 8、redis鎖八大機(jī)制
- 加鎖,可重入鎖,維持加鎖-看門狗機(jī)制,鎖互斥, 手動釋放鎖,自動釋放鎖,加鎖超時(shí),超時(shí)釋放鎖
- 9、過期策略
- 10、redis 集群模式
- 11、Redis為什么快?
- 內(nèi)存模式+內(nèi)存淘汰策略:內(nèi)存模式保證查詢快,內(nèi)存淘汰保證安全
- 網(wǎng)絡(luò)模型
- RESP協(xié)議是CS架構(gòu),內(nèi)部數(shù)據(jù)結(jié)構(gòu)簡單,準(zhǔn)確
- epoll,非阻塞的多路復(fù)用,基于信號IO驅(qū)動
- 零拷貝
- 持久化,保證數(shù)據(jù)安全性
- 原子事務(wù)
- 12、Redis的特性
- 內(nèi)存,持久化,事務(wù),Io多路服務(wù),Epoll機(jī)制
第二部分:Redis實(shí)戰(zhàn)場景
1、Redis的應(yīng)用場景
- 1、分布式緩存:旁路緩存,對象緩存,全頁緩存,熱點(diǎn)數(shù)據(jù)緩存
- 2、分布式鎖
- 3、分布式Session共享
- 4、分布式唯一ID生成
- 5、分布式限流
- 6、計(jì)數(shù)器
- 7、排行榜
- 8、位統(tǒng)計(jì)功能:簽到打卡,用戶留存率,用戶活躍度
- 9、延時(shí)操作:
- 10、點(diǎn)贊,關(guān)注和推薦,朋友圈可見
- 11、消息隊(duì)列
- 12、抽獎
- 13、標(biāo)簽
- 14、過濾(布隆過濾器),篩選
- 15、業(yè)務(wù)處理:交集,差集,并集
2、Redis問題以及解決方案
- 1、緩存雪崩
- 原因: 緩存同時(shí)過期
- 方案:
- (1)加隨機(jī)過期時(shí)間
- (2)多級緩存
- (3)限流+讀鎖
- 2、緩存穿透
- 原因:大量訪問緩存和數(shù)據(jù)庫不存在數(shù)據(jù)
- 方案:
- (1)訪問校驗(yàn)
- (2)Hash攔截
- (2)布隆過濾
- (3)空值緩存
- (4)混合方式解決,即空值短緩存,頻繁請求加校驗(yàn)
- 3、緩存擊穿
- 原因:熱點(diǎn)數(shù)據(jù)過期
- 方案:
- 4、熱點(diǎn)key問題
- 原因:熱點(diǎn)數(shù)據(jù)超頻繁,造成服務(wù)過載
- 方案:
- (1)多級緩存
- (2)集群擴(kuò)容,分片負(fù)載
- (3)熱點(diǎn)分散
- 5、redis大key問題
- 原因:Hash,List,set,zset等集合由于時(shí)間累積造成key過大
- 方案:
- (1)定時(shí)過期重建key
- (2)壓縮value
- (3)拆分bigkey
- (4)定期檢查key移除失效元素,進(jìn)行瘦身
- 6、雙寫一致性問題
- 原因:高并發(fā)場景下緩存和DB更新導(dǎo)致讀寫不一致問題
- 方案:
- 1、更新cache,更新DB-問題:更新DB失敗造成臟數(shù)據(jù)
- 2、更新DB,更新Cache-問題:更新Cache失敗造成臟數(shù)據(jù)
- 3、刪除cache,更新DB-問題:高并發(fā)場景,會讀取到未更新DB的臟數(shù)據(jù)
- 4、延遲雙刪,刪除Cache,更新DB,刪除Cache:一定程度上可以保證,但是
- 5、更新DB,延遲更新Cache-通過Canol或MQ方式延遲更新Cache,某種方式來說可以解決更新Cache失敗問題
第三部分:深入Redis原理
1、Redis數(shù)據(jù)類型以及應(yīng)用場景
- 數(shù)據(jù)類型
- string,Hash,List,Set,ZSet,BitMap,Geo,LogLog
- 使用場景:
- 分布式緩存(旁路緩存,讀寫緩存),分布式鎖,分布式Session,
- 計(jì)數(shù)器,布隆過濾器,限流器
- 消息隊(duì)列,秒殺,紅包,抽獎.點(diǎn)贊,關(guān)注,簽到,榜單,
2、持久化機(jī)制
- 持久化方式
- RDB方式:恢復(fù)快,文件小,數(shù)據(jù)安全低
- RDB持久化:save指定觸發(fā)后,redis會fork出一個線程,拷貝出當(dāng)前運(yùn)行時(shí)副本,成功后
- AOF方式:內(nèi)容多,文件大,恢復(fù)慢,數(shù)據(jù)安全高
- AOF大小觸發(fā)重做后,redis會fork出一個新線程,拷貝出當(dāng)前運(yùn)行時(shí)數(shù)據(jù)副本的保存命令,后再執(zhí)行增量數(shù)據(jù)命令
- 持久化策略
3、redis鎖機(jī)制,事務(wù)機(jī)制,原子性等
- 鎖機(jī)制
- 過程
- getLock,如果true,則setnx,執(zhí)行程序,主動釋放lock,完成,如果程序超時(shí),通過expire被動釋放lock
- getLock,如果false,則自旋等待已經(jīng)占有鎖線程釋放lock
- 作用:
- 保證分布式環(huán)境下,線程競爭資源的正常運(yùn)行。
- 原子性
- redis的原子操作指令:incr和decr,setnx
- 自定義實(shí)現(xiàn)方式
- 使用Lua腳本
- 使用事務(wù)+監(jiān)控方式:
- 1、監(jiān)控:watch key,2、事務(wù)開始:MULTI,3、定義事務(wù)原子操作:SET key 100 4、執(zhí)行事務(wù): EXEC
- 事務(wù)機(jī)制
- 原子性,一致性,隔離性,持久性,順序性
- Redis事務(wù)流程
- 事務(wù)開始 MULTI,WATCH,命令入隊(duì),取消入隊(duì)DISCARD,事務(wù)執(zhí)行 EXEC
2、Redis的數(shù)據(jù)結(jié)構(gòu)
- SDS 動態(tài)字符數(shù)組,每個數(shù)組由頭部,len,freelen組成
- LinkedList 雙向鏈表結(jié)構(gòu)
- ZipList 壓縮鏈表結(jié)構(gòu),集合長度小于512或長度小于64k時(shí)采用壓縮表結(jié)構(gòu)
- QuickList 快速鏈表結(jié)構(gòu),v3.2以后改進(jìn),由linked+ziplist組成,linkedlist保證快速遍歷,ziplist保證數(shù)據(jù)壓縮
- hashtable 哈希表結(jié)構(gòu),redis全局也是hash表結(jié)構(gòu)
- skiplist - 跳表結(jié)構(gòu)-結(jié)構(gòu)上結(jié)點(diǎn)之間有多個指針,能夠根據(jù)key快速跳到對應(yīng)的位置
3、Redis快速的原因
- 基于內(nèi)存實(shí)現(xiàn)的KV結(jié)構(gòu),便于快速查找
- 高效的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)編碼
- 單線程模型,避免線程上下文切換
- 高效的網(wǎng)路傳輸協(xié)議,使用epoll實(shí)現(xiàn)IO多路復(fù)用機(jī)制
- 高效的內(nèi)存淘汰機(jī)制,保證緩存命中率
4、Redis線程模型,IO模型,網(wǎng)絡(luò)模型等
- 線程模型
- 單線程模型:即網(wǎng)絡(luò)請求采用單線程,分為文件事件處理器-包括請求連接,命令請求,命令響應(yīng)
- 多線程模型:連接,持久化,語法檢查
- 網(wǎng)絡(luò)Io模型
- 多路復(fù)用
- 多路是網(wǎng)絡(luò)請求多路
- 復(fù)用是處理線程復(fù)用
- 內(nèi)存模型
- 本身內(nèi)存,數(shù)據(jù)內(nèi)存,緩沖內(nèi)存,碎片內(nèi)存