1. 程式人生 > >redis快取穿透之setnx使用場景

redis快取穿透之setnx使用場景

    隨著業務的增長,請求併發的增大。很多公司在業務場景中會增加快取策略,而快取用的最多的也就是redis了。

    今天我們來說一下快取穿透,我們快取一般是有時效性的,一定的生命週期過去之後就會消失,一般的系統不會設定永久性的儲存,這時候就會遇到一個問題,要麼就是主動重新整理快取,要麼就是程式被動重新整理快取。

    事實證明很多程式當中很少主動重新整理因為你要去寫指令碼,定時去重新整理資料,這樣的話代價比較大。所以較多的就選擇了程式被動重新整理快取,就是在快取失效之後讀庫在寫入快取。這裡就會導致一個問題那就是:當快取失效的那一刻大量的請求過來就會直接打到資料庫上,如果併發量大的話讀庫操作肯定會有影響,連線超時,連線數過大這樣的情況也會隨時遇到。

    針對這種情況redis有一個程序鎖也就是我們今天說的setnx

    下面直接貼程式碼:

    $ret = $this->redis->get('k' . $abbr);
    if (empty($ret)) {
    $ret1 = $this->redis->setnx('k'.$abbr,$ret);
        if($ret1){
        $sql = "select * from xxx where a=xx;";
        $query = $this->db->query($sql);
        $ret 
= $query->result_array(); $this->redis->set('b' , json_encode($ret) , 6400); $this->redis->set('bakk', json_encode($ret) , 10000);     }    else{      $ret = $this->redis->get('bakk' . $abbr);     }     }

    這段程式的邏輯就是先用一個程序去請求資料如果沒有了用setnx鎖住這個鍵只有一個程序去讀庫操作然後重寫兩個鍵值,一個主要的查詢鍵值,一個備份的鍵值當然快取時間會長點。這樣不管多少請求過來只有一個程序去做讀庫操作,其他的還是讀redis備份資料。用空間來換取時間和效率還是比較划算的。

    這就是針對快取穿透做的一套操作,下面上一下這個流程圖:


相關推薦

redis快取穿透setnx使用場景

    隨著業務的增長,請求併發的增大。很多公司在業務場景中會增加快取策略,而快取用的最多的也就是redis了。    今天我們來說一下快取穿透,我們快取一般是有時效性的,一定的生命週期過去之後就會消失,一般的系統不會設定永久性的儲存,這時候就會遇到一個問題,要麼就是主動重新

Redis快取設計快取穿透快取雪崩

使用快取的優缺點: 優點: 提高系統響應速度,加速讀寫,Redis將數全都存放在記憶體中,響應速度更快。 降低了後臺的負載,減少了對後端的直接訪問 缺點: 資料一致性問題,快取層的資料與儲存層的資料可能存在不一致的問題 維護複雜度高了,加入快取後要同時處理快取曾和持

Redis快取穿透問題及解決方案

上週在工作中遇到了一個問題場景,即查詢商品的配件資訊時(商品:配件為1:N的關係),如若商品並未配置配件資訊,則查資料庫為空,且不會加入快取,這就會導致,下次在查詢同樣商品的配件時,由於快取未命中,則仍舊會查底層資料庫,所以快取就一直未起到應有的作用,當併發流量大時,會很容易把DB打垮。 快取穿透問題 快

Redis 快取穿透快取擊穿,快取雪崩的解決方案分析

設計一個快取系統,不得不要考慮的問題就是:快取穿透、快取擊穿與失效時的雪崩效應。 一.什麼樣的資料適合快取? 分析一個數據是否適合快取,我們要從訪問頻率、讀寫比例、資料一致性等要求去分析.  二.什麼是快取擊穿 在高併發下,多執行緒同時查詢同一個資源,如果快取中沒有這個資源,那麼這些執行緒都會去資料庫

Redis快取穿透快取雪崩、redis併發問題分析

把redis作為快取使用已經是司空見慣,但是使用redis後也可能會碰到一系列的問題,尤其是資料量很大的時候,經典的幾個問題如下:(一)快取和資料庫間資料一致性問題分散式環境下(單機就不用說了)非常容易

[Redis] - 高併發下Redis快取穿透解決

高併發情況下,可能都要訪問資料庫,因為同時訪問的方法,這時需要加入同步鎖,當其中一個快取獲取後,其它的就要通過快取獲取資料. 方法一: 在方法上加上同步鎖 synchronized //加同步鎖,解決高併發下快取穿透 @Test public synchronized void

從.Net到Java學習第七篇——SpringBoot Redis 快取穿透

場景描述:我們在專案中使用快取通常都是先檢查快取中是否存在,如果存在直接返回快取內容,如果不存在就直接查詢資料庫然後再快取查詢結果返回。這個時候如果我們查詢的某一個數據在快取中一直不存在,就會造成每一次請求都查詢DB,這樣快取就失去了意義,在流量大時,可能DB就掛掉了。 穿透:頻繁查詢一個不存在的資料,

redis-快取穿透快取雪崩

快取穿透 快取系統,按照KEY去查詢VALUE,當KEY對應的VALUE一定不存在的時候並對KEY併發請求量很大的時候,就會對後端造成很大的壓力。 如何避免 1.對查詢機構為空的情況也進行快取,快取

redis快取穿透 快取雪崩的解決方法

一.快取穿透:      快取穿透是指查詢一個一定不存在的資料,由於快取是不命中時需要從資料庫查詢,查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到資料庫去查詢,造成快取穿透。      解決辦法:      1.布隆過濾   對所有可能查詢的引數以ha

Redis快取穿透快取併發、快取雪崩

一、快取穿透 1.產生原因: 查詢方式是先查詢快取、如果快取不存在則查詢資料庫、將查詢的結果回寫到快取、穿透的概念是快取不存在的情況下查詢資料庫、高併發應用下可能造成資料庫壓力過大 2.解決方案: 2.1:將對應的key為空的值也快取起來,減少資料庫的查詢 2.2:

雙重檢測同步鎖---防止Redis快取穿透

快取穿透: 注: 上面三個圖會有什麼問題呢? 我們在專案中使用快取通常都是先檢查快取中是否存在,如果存在直接返回快取內容,如果不存在就直接查詢資料庫然後再快取查詢結果返回。這個時候如果我們查詢的某一個數據在快取中一直不存在,就會造成每一次請求都查詢DB,這樣快取就

redis快取穿透快取雪崩、熱點Key問題分析及解決方案

我們通常使用 快取 + 過期時間的策略來幫助我們加速介面的訪問速度,減少了後端負載,同時保證功能的更新。 快取穿透 快取系統,按照

Redis快取穿透快取雪崩和快取擊穿

Redis快取穿透、快取雪崩 快取雪崩,是指在某一個時間段,快取集中過期失效。 產生雪崩的原因之一,比如在寫本文的時候,馬上

redis快取穿透快取擊穿,快取雪崩原因+解決方案

一、前言 在我們日常的開發中,無不都是使用資料庫來進行資料的儲存,由於一般的系統任務中通常不會存在高併發的情況,所以這樣看起來並沒有什麼問題,可是一旦涉及大資料量的需求,比如一些商品搶購的情景,或者是主頁訪問量瞬間較大的時候,單一使用資料庫來儲存資料的系統會因為面向磁碟,磁碟讀/寫速度比較慢的問題而存在嚴

【乾貨!!】三句話搞懂 Redis 快取穿透、擊穿、雪崩

前言 如何有效的理解並且區分 Reids 穿透、擊穿和雪崩之間的區別,一直以來都挺困擾我的。特別是穿透和擊穿,過一段時間就稀裡糊塗的分不清了。 為了有效的幫助筆者自己,以及擁有同樣煩惱的朋友們區分這三種場景。筆者總結了一些關鍵詞,希望大家可以和我一樣通過聯想的方式來區分並理解這三種場景的區別! 快取穿透: 關

Redis快取穿透快取雪崩、快取擊穿好好說說

### 前言 Redis是目前非常流行的快取資料庫啦,其中一個主要作用就是為了避免大量請求直接打到資料庫,以此來緩解資料庫伺服器壓力;用上快取難道就高枕無憂了嗎?no,no,no,沒有這麼完美的技術, 快取穿透、快取雪崩、快取擊穿這些問題都得好好聊聊。 ### 正文 #### 1. 快取穿透 ####

【實戰問題】-- 快取穿透布隆過濾器(1)

前面我們提到,在防止快取穿透的情況(快取穿透是指,**快取和資料庫都沒有的資料**,被大量請求,比如訂單號不可能為`-1`,但是使用者請求了大量訂單號為`-1`的資料,由於資料不存在,快取就也不會存在該資料,所有的請求都會直接穿透到資料庫。),我們可以考慮使用布隆過濾器,來過濾掉絕對不存於集合中的元素。

Redis常用場景、資料結構、讀寫一致、快取穿透快取雪崩等

一、分散式系統為什麼要用Redis 1、效能 我們在碰到需要執行耗時特別久,且結果不頻繁變動的 SQL,就特別適合將執行結果放入快取。這樣,後面的請求就去快取中讀取,使得請求能夠迅速響應。 2、併發 在大併發的情況下,所有的請求直接訪問資料庫,資料庫

分散式快取Redis適用場景

寫在前面   本學習教程所有示例程式碼見GitHub:https://github.com/selfconzrr/Redis_Learning   學而用之嘛。在這總結一下,Redis的適用場景,合理的使用Redis會讓你的專案變得更高效。 1、顯示最新的專案列表   下

高併發程式設計高併發場景:秒殺(無鎖、排他鎖、樂觀鎖、redis快取的逐步演變)

環境: jdk1.8;spring boot2.0.2;Maven3.3 摘要說明: 在實際開發過程中往往會出現許多高併發場場景,秒殺,強紅包,搶優惠卷等; 其中: 秒殺場景的特點就是單位時間湧入使用者量極大,商品數少,且要保證不可超量銷售; 秒殺產品的本質就是減