本人小白乙個,不能保證部落格中內容都準確,如果部落格中有錯誤的地方,望各位多多指教,請指正。歡迎找我一起討論
redis 是用 c語言編寫的乙個非關係型資料庫
redis可以用來做快取,分布式鎖
redis適合儲存 高頻的熱點資料---廣告 、使用者經常訪問的資料
redis是基於記憶體的,絕大部分請求都是純粹的記憶體操作,速度非常快,
資料結構非常簡單,對資料操作也簡單
採用的是單執行緒,避免了上下文切換和競爭條件,不存在多個執行緒切換導致的cpu消耗,也不用考慮鎖的問題
使用多路復用io模型,非阻塞io
rdb (預設) : 按照一定的時間將記憶體的資料以快照的形式儲存在硬碟全量同步用rdb
aof :將redis執行的每次寫命令記錄到單獨的日誌檔案中,當重啟redis時,會通過執行這個日誌檔案中記錄的操作來恢復資料增量同步用aof
當兩種方式同時開啟時,資料恢復redis會優先選擇aof恢復
rdb 檔案小,對效能的消耗小,恢復速度快,但會出現丟失的現象 (rdb 是間隔一段時間進行持久化,如果持久化之間 redis 發生故障,會發生資料丟失)
aof 檔案比較大,對效能消耗大,恢復速度比較慢 ,資料安全
string - 驗證碼、使用者認證資訊、普通快取資料
list - 可以用作訊息佇列
hash - 使用者購物車資料、秒殺時間段對應商品資訊
set - 可以實現獲取兩個集合的差集、交集,比如共同好友
zset - 可以用來實現優先順序佇列(比如延遲任務佇列)
快取雪崩
redis掛了,或者大批量key同時失效,讓很多請求訪問mysql解決方案100w條不同的資料 過期時間都是 10天,那麼10天過後 這100w條資料 全部同時失效
redis 雪崩 : 大量的key在同一時間失效 ,導致大量請求直接訪問資料庫
解決: 錯開過期時間
快取擊穿 : 資料庫中有這條資料,快取中沒有
某個熱點資料剛好過期(失效),redis把這條資料自動刪除了,此時,大量併發因快取過期未命中redis,導致請求mysql解決方案
快取穿透 : 資料庫 和 redis中都沒有這條資料
大量的不存在的key值(查詢的key值在redis中和mysql資料庫中都沒有資料,這個值根本就不存在, 比如 id = -1 , 在mysql中id自增主鍵 不肯能為 -1 ,所以此時在redis中和mysql資料庫中都沒有資料,直接穿透了redis 和 資料庫 ),透過redis,查詢mysql解決方案
什麼情況下 會出現這樣的問題 ? 更新操作的時候
比如說 我現在資料庫中有1001 條資料 redis中也有1001條資料 ,現在要更新資料,那應該怎麼更新資料呢?
場景一: 先更新資料庫中資料,再更新redis快取資料,如果 更新redis快取資料失敗了呢,redis宕機?此時 資料庫中是新資料,redis中是舊資料,資料出現了不一致
場景二: 先更新資料庫中資料,再更新redis快取資料,如果因為網路等原因,執行緒b 比執行緒a先更新了redis快取,此時就出現了資料不一致(髒資料)
解決:先刪除快取,再修改資料庫。如果資料庫修改失敗了,那麼資料庫中的是舊資料,快取中是空的,那麼資料不會不一致。因為讀的時候快取沒有,則讀資料庫中的舊資料,然後更新到快取中
場景三: 先刪除快取,再更新資料庫。此時資料發生了變更,先刪除快取,再去修改資料庫,此時另外乙個請求過來,去讀快取,發現快取是空的去查詢資料庫,查到的是舊資料,更新到快取中,隨後資料變更的程式完成了資料庫的值更新了,此時資料庫和快取中的資料不一樣。
解決:方案一: 延時雙刪 刪除redis-->更新mysql-->延時5秒鐘-->刪除redis
方案二 (解決讀多寫少的場景) : 用讀寫鎖 優化 讀寫鎖 的鎖物件 要一樣 可以使用 redisson 直接 獲取鎖 底用的是 lua指令碼 在設定每個key的時候繫結了乙個mode
,讀鎖繫結了乙個 read mode 寫鎖繫結了乙個 write mode
方案三 (解決讀多寫多的場景) :
快取設定乙個超時時間(這個時間要根據業務場景來定) 又要用快取 又要用資料庫 又要支撐高併發 ,只能去保證最終一致性
讀多寫多的場景 就不應該用快取 ,直接讀資料庫不就可以了
讀多寫多的場景 又要用快取 怎麼解決資料不一致 (保證一致性,非最終一致性,可以理解為強一致性) ? cannal中介軟體可以解決
惰性刪除:
定期刪除:
第二種策略:全部資料檢測
第三種:放棄資料淘汰
Redis知識總結
什麼是關係型的資料庫 以關係模型來組織資料的資料庫,以行與列的方式來儲存資料。什麼是nosql資料庫 泛指非關係型資料庫,以鍵值對的方式來儲存資料,大大增加了業務擴充套件能力 常用的nosql資料庫 1 memcached 2 redis 3 mongodb 什麼是redis redis是乙個鍵值對...
Redis的知識總結
redis的快取雪崩,擊穿,和穿透的描述和解決方案?1.快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。解決方案 1.介面層增加校驗,如使用者鑑權校驗,id做基礎...
Redis知識點總結
fifo first in first out,先進先出。判斷被儲存的時間,離目前最遠的資料優先被淘汰。lru least recently used,最近最少使用。判斷最近被使用的時間,目前最遠的資料優先被淘汰。lfu least frequently used,最不經常使用。在一段時間內,資料被...