之前我有博客也嘗試過使用redis,在實際的項目中確實作用挺大的。至少對於數據的頻繁讀取來說都起着至關重要的作用。
但是隨着技術的學習,慢慢的業務要復雜起來,以后也許會用到redis集群,所以在這邊查詢了一些資料,做了一些思考和理解。
如果有問題,請提出,虛心接受,認真學習。
一般的redis邏輯
請求過來,redis里面有沒有?有就給用戶
沒有查詢數據庫
數據庫里面有沒有?沒有告訴用戶沒有
有就查詢出來,給用戶,並且存放到redis
redis緩存會出現什么問題?
redis緩存數據庫的數據,有一點就顯得特別重要,那就是數據一致性的問題。
單個數據庫在多線程操作的時候如果不是數據庫鎖的限制會出現很多數據不一致的問題,ACID這里我就不多說了。
redis緩存也會有這樣的問題,就是數據庫的數據更新到redis是會有時間差的,這樣的時間差就會導致數據不一致。
比如一件商品價格在數據庫里面是500,然后redis也是500,但是突然數據庫修改成了600,如果所有用戶都是讀入數據庫的話,數據庫會加鎖,然后避免用戶讀出之前那個500,但是redis的更新怎么說都是有時間差的,所以用戶就有可能讀取到500這個數據。
這就是數據不一致的問題。
redis適合緩存怎么樣的數據?
這里的數據分為兩塊,第一是數據庫的數據,第二是頁面的一些靜態數據。
這里說的是數據庫的數據。
頁面的一些靜態數據不適合存放在緩存中。
然后對於上面提出的數據不一致的問題,所以緩存的數據也有要求。
不要緩存那些對於數據一致性要求很高的數據。
如果這個數據存在被修改的可能性,那么最好不要存緩存,要么,就不要放數據庫,只放緩存。
那些對於數據一致性不高的數據,都是可以放的。
強調一點是,如果這個數據放了,但是對於這個數據的操作不是修改,而是只有刪除的話,也是可以存放緩存的,因為在實際操作中,如果一個刪除操作被執行的時候,緩存可以先進行刪除,這樣就能確保沒有用戶能夠讀取到刪除之后的數據,然后再對數據庫進行刪除。
redis集群
redis集群,這邊我給出的建議是使用redis的主從復制功能,這個功能和mysql的主從復制是一個道理,都能很好的確保數據的一致性。
具體redis集群的配置以及實驗我會在后面新的博客中給出的。
總結一下:具體的使用過程中,使用redis的超時可以對數據進行一些持久化管理,對於一些數據一致性不高的數據進行緩存,使得讀取速度提高,使用redis集群時可以是用主從復制功能,Redis集群沒有中心節點,並且帶有復制和故障轉移特性,這可以避免單個節點成為性能瓶頸,或者因為某個節點下線而導致整個集群下線。
本人的經驗也不多,希望有經驗的師傅們能提供多一些的建議。