Redis

小說:十三水·九屆網絡出品作者:建秉宗更新時間:2019-02-20字數:80233

Redis


  相信很多同學都使用緩存,那么在使用的過程中是否遇到過一些問題(本文拿Redis為例):

  1. 在集群環境中,如果遇到了大量的查詢,先經過緩存攔截,緩存沒有再走到DB。這種是普通的操作 Client -> Redis -> DB。那么如果請求的數量非常大的時候,直接穿透了緩存該如何處理呢?

    1.1 出現這種情況的時候可能會出現大量查詢相同ID的數據,比如瞬間來了一萬條ID=100的請求,在這個時候數據庫里一次性要查一萬條數據,此時如何處理?

    1.2 出現數據庫中不存在ID=100的時候如何處理?此時有兩種情況,第一種是惡意的請求,第二種是此時數據庫中不存在,可能在后續的某一個時間段存在了如何處理?

? ? ? ?2. 還是在集群環境中,還是大量的查詢,此時瞬間來了一萬個ID不同的數據,此時緩存中也不存在,這種情況如何處理?

  3. 使用緩存中還有哪些注意點?

? ? ? ?下面根據我自己學習和研究來找到一些解決的方案,因為網上有太多的解決方案,大家可以找到自己業務場合適的方案,這才是最重要的。

  第一種情況為緩存穿透,在高并發的場景下,如果緩存穿透大量的請求直接走到DB,這樣DB就會直接被大量的SQL請求拖垮,然后數據庫無響應,這個時候數據庫出現宕機,整個系統崩潰。但是這里邊有以上兩種情況,瞬間過來一萬個ID=100的請求時,在集群中,如果瞬時間代碼都出現在判斷緩存沒有時,那么這一萬個請求也是直接走到數據庫中請求,雖然一萬個請求都到數據庫上,有人覺得可能數據庫還可以支持,但是如果瞬間來十萬個的話數據庫也會抗不住的。

  此時,我們應該使用Redis的鎖機制setnx,大家可以網上搜索一下資料。主要的功能是將key鎖住,然后在集群中只有一臺機器獲取鎖,并操作數據庫。這里邊有個小細節,那就是一個一個鎖,最后其實還是一萬次操作DB,只不過誰先獲取數據庫誰進行操作。這里邊就需要再精細設計了,那就是在里邊再加入一層緩存,即獲取鎖之后,從數據庫取之前再次從緩存中獲取這個Key的值,如果有值了,就直接返回即可,如果沒有值,就從數據庫里邊查詢一次,然后再放到緩存即可。

  如果數據庫里沒有這個值,我們也需要進行特殊處理,設置這個值的過期時間盡量短一些,然后將它的key對應的value設置為‘--’,這樣我看一看到value為‘--’,就知道數據庫沒有數據。如果緩存超過時間后自動就沒有了,然后再次請求數據庫查詢。這樣設計一萬次相同ID的話,需要的也只是一次數據庫操作。其實還有另外一個思路就是這,這個數據是讀操作,那么我們就和其他的key設置相同的時間,當數據庫中有了這條數據,即產生了insert語句時,我們需要更新緩存即可。

  第二種情況,高并發時瞬間一萬個不同的ID過來,這個會產生一萬不同的key,這樣采用Redis的分布式鎖顯然也會觸發一萬個請求,在這其中,也有兩種情況,一是數據庫中確實有這一萬個請求,第二種數據庫里沒有這一萬個請求,此種情況可能是爬蟲也可能是惡意攻擊。

  這種情況應用的策略就是采用隊列,每個請求需要將其唯一的標志帶過來,比如登錄的用戶郵箱,IP等信息,假如這一萬個都是真實的用戶時,并且都是有效的請求,此時我們將請求放入執行隊列,一次從隊列中取出一千個進行處理,這樣一萬個請求只需要十次處理完成,同時我們還需要以上的鎖機制和沒有數據時將value設置為"--"。我們還要根據一些IP和請求的QPS來判斷是否是惡意的情況,比如同一個IP,請求的QPS為1千個,我們需要禁用這個IP請求操作。這個就不在此多講了。

  在系統處理請求的過程中,一定要保護好DB,因為它是一個比較核心的位置。DB壞了其實就沒法玩了。

  我們使用緩存的時候一般要做多級緩存,Client -> ConcurrentHashMap -> Redis --> DB 或者? Client -> Ehcache -->Redis --> DB,要盡可能保證到數據庫是最純粹的操作。同時我們如果將value的值盡量設置的小,這樣可以省一些資源。如果你有很多的資源的話,你可以將所有數據都放到Redis里邊,這樣以上的情況基本上都不用擔心了,也就是不設置超時時間。當數據有任務的Update操作,更新一個緩存即可。

  在使用的過程中,每個業務的場景可能有所不同,同學們可以根據自己實際的業務進行判斷和取舍。

  歡迎提意見~

  

當前文章:http://www.hfcxdn.com/array/4yhtlgrgpn.html

發布時間:2019-02-20 01:15:59

方塊大戰爭2無限鉆石版 大神棋牌金花版 蘋果德州撲克金幣 金博棋牌1.1.2版本 熊貓四川麻將可以作弊嗎 撲魚棋牌游戲大廳下載 糖果派對技巧與玩法 蝸牛集市安卓 網易游戲app官方下載 線上德州撲克技巧全攻略

編輯:王王文乙

我要說兩句: (0人參與)

發布
捕鱼达人之深海狩猎