redis緩存
在互聯網應用中經常需要用redis來緩存熱點數據。
-
redis數據在內存,可以保證數據讀取的高效,接近每秒數十萬次的吞吐量
-
減少下層持久層數據庫讀取壓力,像mongodb,每秒近千次讀取就已經表示壓力山大
-
redis單進程單線程運行,天然具備讀寫的原子性,避免並發導致臟讀等問題
使用
一般的使用方式是
讀取
-
先get讀取redis,沒有讀到即未命中則讀取db
-
將db讀到的數據set寫入redis,返回數據
更新
-
del掉redis的數據,
-
寫數據庫
之所以先del,是防止寫數據成功但因網絡原因沒有更新redis,導致數據不一致。而先del則即使寫數據庫失敗也不會有副作用。
有些在使用時將del換為set,就是在更新時直接更新緩存,這可以一定程度提高緩存的命中率。但在並發更新時會有概率導致redis跟數據庫數據不一致,同時也不能避免上面說的寫數據庫失敗的副作用。另外作為熱點數據的緩存,這里set會導致緩存部分非熱點的數據,內存有限時反而降低命中率。
並發問題
按照上面的使用方式基本可以達到使用緩存的目的,但扔存在並發問題,問題出在上面讀取過程兩個步驟之間,有另外一個線程執行了更新,那2執行寫入redis就會用老數據覆蓋掉更新的數據。如何解決呢?采用類似樂觀鎖的原理,在del時不再是簡單的刪除key,而是寫入一個空值標識f1,在未命中寫緩存時將get到的標識f1作為參數給redis,只有redis當前value與f1一致時才執行set。基本時序圖如下:

Redis做MySQL的緩存是怎么做的?
做緩存的前提是數據不保持實時一致,如果需要實時一致的數據,那就失去了為MySQL做緩存的意義,還不如直接在redis里實現業務。
邏輯上是這樣:
每當你查詢數據,會先從redis里查詢,發現沒有這條數據再去Mysql里查詢,並把結果寫入redis同時設置生存時間。(保持的key是sql語句,value是結果。幾乎是沒有邏輯的)
當對Mysql進行修改和新增操作后,redis並不會修改。只有當key過期下次查詢時才會更新數據。
1.定義:
Redis 是一個開源(BSD許可)的,基於內存的,多數據結構存儲系統.;
作用於:數據庫、緩存和消息中間件,支持多種類型的數據結構;
2.常用的數據類型:
String;
Hash;
List;
Set;
SetSorted;
3.存儲方式:
以一種鍵值對的方式;
4.特點:
有三種存儲分別為:內存存儲,磁盤存儲,log文件;
支持主從模式,可以配置集群;
5.好處:
速度快;
支持豐富數據類型;
支持事物,操作具有原子性;
6.應用場景:
數據庫;
緩存;
隊列;
排行榜/計數器;
發布/訂閱等;
7.常見性問題與解決方式:
① : Master寫內存快照,save命令調度rdbSave函數,會阻塞主線程的工作,當快照比較大時對性能 影響是非常大的,會間斷性暫停服務,所以Master最好不要寫內存快照。
② : Master AOF持久化,如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會不斷增大,AOF文件過大會影響Master重啟的恢復速度。Master最好不要做任何持久化工作,包括內存快照和AOF日志文件,特別是不要啟用內存快照做持久化,如果數據比較關鍵,某個Slave開啟AOF備份數據,策略為每秒同步一次。
③ : Master調用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會占大量的CPU和內存資源,導致服務load過高,出現短暫服務暫停現象。
④ : Redis主從復制的性能問題,為了主從復制的速度和連接的穩定性,Slave和Master最好在同一個局域網內