redis整理

Redis

Redis是一個key-value存儲系統。mysql

Redis支持五種數據類型:
  • string(字符串)
  • list(列表)
  • hash(hash表)
  • set(集合)
  • zset(有序集合)

memcached相似,redis支持的數據類型更豐富、數據能持久化。
memcached把數據所有存儲在內存中,斷電後會掛掉,數據不能超過內存大小。
而redis`數據會按期備份到硬盤上。redis

落地策略sql

  • RDB持久化(snapshotting):快照,總體備份。在指定的時間間隔內將內存中的數據集快照寫入磁盤,其實是fork一個子線程,先將數據集寫入臨時文件,寫入成功後,再替換以前的文件,用二進制壓縮存儲。
  • AOF持久化(append-only-file):以日誌的形式記錄服務器所處理的每個寫、刪除操做,查詢操做不會記錄,以文本的方式記錄,能夠打開文件看到詳細的操做記錄。

過時策略數據庫

  • 按期刪除:redis會把設置了過時時間的key放在單獨的字典中,定時遍從來刪除到期的key
    • 每100ms從過時字典中隨機挑選20個,把其中過時的key刪除
    • 若是過時的key佔比超過1/4,重複步驟1
  • 惰性刪除
    • 過時的key並不必定會立刻刪除,還會佔用着內存。當你真正查詢這個key時,redis會檢查一下,這個設置了過時時間的key是否過時了,若是過時了就會刪除,返回空。
  • 內存淘汰機制
    redis內存超出物理內存限制時,會和磁盤產生swap,這種狀況性能極差,通常是不容許的。
    (1)noeviction:拒絕寫操做,讀、刪除能夠正常使用。默認策略
    (2)allkeys-lru:移除最近最少使用的key,最經常使用的策略
    (3)allkeys-random:隨機刪除某個key
    (4)volatile-lru:在設置了過時時間的key中,移除最近最少使用的key
    (5)volatile-random:在設置了過時時間的key中,隨機刪除某個key
    (6)volatile-ttl:在設置了過時時間的key中,把最先要過時的key優先刪除

Redis緩存和MySQL數據一致性方案

在高併發的業務場景下,數據庫大多數狀況都是用戶併發訪問最薄弱的環節。因此,就須要使用redis作一個緩衝操做,讓請求先訪問到redis,而不是直接訪問MySQL數據庫
請求先訪問redis緩存,若是緩存中有數據,直接加載數據,若是緩存中沒有數據,再訪問數據庫,數據庫會將數據放入redis中,而後加載數據。
讀取緩存通常沒有什麼問題,可是一旦涉及到數據更新:數據庫和緩存更新,就容易出現緩存redis和數據庫MySQL間的數據一致性問題。緩存

  • 若是先刪除了緩存Redis,尚未來得及寫庫MySQL,另外一個線程就來讀取,發現緩存爲空,則去數據庫中讀取數據寫入緩存,此時緩存中沒髒數據。
  • 若是先寫了庫,在刪除緩存以前,寫庫的線程宕機了,沒有刪除掉緩存,則也會出現數據不一致狀況。

由於寫和讀是併發的,無法保證順序,就會出現緩存和數據庫的數據不一致的問題。服務器

解決方案:異步更新緩存(基於訂閱binlog的同步機制)
MySQLbinlog增量訂閱消費+消息隊列+增量數據 更新到redis
(1)讀redis:熱數據基本都在redis
(2)寫MySQL:增刪改都是操做MySQL
(3)更新redis數據:MySQL的數據操做binlog,來更新到redis併發

注意:MySQL實現主從一致性,也是基於訂閱binlog來實現增量操做。
binlog:是MySQL的二進制文件,用於記錄MySQL的數據更新(insertupdatedelete操做)。app

相關文章
相關標籤/搜索