Redis
Redis
是一個key-value
存儲系統。mysql
string
(字符串)list
(列表)hash
(hash表)set
(集合)zset
(有序集合)和memcached
相似,redis
支持的數據類型更豐富、數據能持久化。
memcached
把數據所有存儲在內存中,斷電後會掛掉,數據不能超過內存大小。
而redis`數據會按期備份到硬盤上。redis
落地策略sql
RDB
持久化(snapshotting
):快照,總體備份。在指定的時間間隔內將內存中的數據集快照寫入磁盤,其實是fork
一個子線程,先將數據集寫入臨時文件,寫入成功後,再替換以前的文件,用二進制壓縮存儲。AOF
持久化(append-only-file
):以日誌的形式記錄服務器所處理的每個寫、刪除操做,查詢操做不會記錄,以文本的方式記錄,能夠打開文件看到詳細的操做記錄。過時策略數據庫
redis
會把設置了過時時間的key
放在單獨的字典中,定時遍從來刪除到期的key
key
刪除key
佔比超過1/4,重複步驟1key
並不必定會立刻刪除,還會佔用着內存。當你真正查詢這個key
時,redis
會檢查一下,這個設置了過時時間的key
是否過時了,若是過時了就會刪除,返回空。redis
內存超出物理內存限制時,會和磁盤產生swap
,這種狀況性能極差,通常是不容許的。noeviction
:拒絕寫操做,讀、刪除能夠正常使用。默認策略allkeys-lru
:移除最近最少使用的key
,最經常使用的策略allkeys-random
:隨機刪除某個key
volatile-lru
:在設置了過時時間的key
中,移除最近最少使用的key
volatile-random
:在設置了過時時間的key
中,隨機刪除某個key
volatile-ttl
:在設置了過時時間的key
中,把最先要過時的key
優先刪除Redis
緩存和MySQL
數據一致性方案在高併發的業務場景下,數據庫大多數狀況都是用戶併發訪問最薄弱的環節。因此,就須要使用redis
作一個緩衝操做,讓請求先訪問到redis
,而不是直接訪問MySQL
數據庫
請求先訪問redis
緩存,若是緩存中有數據,直接加載數據,若是緩存中沒有數據,再訪問數據庫,數據庫會將數據放入redis
中,而後加載數據。
讀取緩存通常沒有什麼問題,可是一旦涉及到數據更新:數據庫和緩存更新,就容易出現緩存redis
和數據庫MySQL
間的數據一致性問題。緩存
Redis
,尚未來得及寫庫MySQL
,另外一個線程就來讀取,發現緩存爲空,則去數據庫中讀取數據寫入緩存,此時緩存中沒髒數據。由於寫和讀是併發的,無法保證順序,就會出現緩存和數據庫的數據不一致的問題。服務器
解決方案:異步更新緩存(基於訂閱binlog
的同步機制)
MySQL
的binlog
增量訂閱消費+消息隊列+增量數據 更新到redis
。
(1)讀redis
:熱數據基本都在redis
(2)寫MySQL
:增刪改都是操做MySQL
(3)更新redis
數據:MySQL
的數據操做binlog
,來更新到redis
併發
注意:MySQL
實現主從一致性,也是基於訂閱binlog
來實現增量操做。
binlog
:是MySQL
的二進制文件,用於記錄MySQL
的數據更新(insert
、update
、delete
操做)。app