redis:
redis支援的資料型別?
string字串、hash(雜湊)、list(列表)、set(集合)、zset(sorted set:有序集合)
如何解決快取雪崩:
我們先說一下什麼是快取雪崩吧~
簡單來說就是redis掛掉了,請求全部走資料庫。
還有就是 如果快取資料設定的過期時間是相同的,並且redis恰好將這部分資料全部刪光了。這就會導致在這段時間內,這些快取同時失效,全部請求到資料庫中。這就是快取雪崩。
如何解決?
第一種的話:
第二種:
在快取的時候給過期時間加上乙個隨機值,這樣就會大幅度的減少快取在同一時間過期。
如何解決快取穿透:
快取穿透是什麼?
請求的資料在快取大量不命中,導致請求走資料庫。然後搞垮資料庫。
如何解決呢?
有兩種方案:
快取與資料庫雙寫一致的問題?其實就是快取與資料庫資料不一致怎麼辦?
從理論上說,只要我們設定了鍵的過期時間,我們就能保證快取和資料庫的資料最終是一致的。因為只要快取資料過期了,就會被刪除。隨後讀的時候,因為快取裡沒有,就可以查資料庫的資料,然後將資料庫查出來的資料寫入到快取中。
除了設定過期時間,我們還需要做更多的措施來盡量避免資料庫與快取處於不一致的情況發生。
對於更新操作有兩種選擇:
首先,要明確的是,無論我們選擇哪個,我們都希望這兩個操作要麼同時成功,要麼同時失敗。所以,這會演變成乙個分布式事務的問題。
所以,如果原子性被破壞了,可能會有以下的情況:
如果第一步已經失敗了,我們直接返回exception出去就好了,第二步根本不會執行。
操作快取:
操作快取也有兩種方案:
一般我們都是採取刪除快取快取策略的,原因如下:
高併發環境下,無論是先運算元據庫還是後運算元據庫而言,如果加上更新快取,那就更加容易導致資料庫與快取資料不一致問題。(刪除快取直接和簡單很多)
如果每次更新了資料庫,都要更新快取【這裡指的是頻繁更新的場景,這會耗費一定的效能】,倒不如直接刪除掉。等再次讀取時,快取裡沒有,那我到資料庫找,在資料庫找到再寫到快取裡邊(體現懶載入)
基於這兩點,對於快取在更新時而言,都是建議執行刪除操作!
先更新資料庫,再刪除快取:
正常的情況是這樣的:
如果原子性被破壞了:
如果在高併發的場景下,出現資料庫與快取資料不一致的概率特別低,也不是沒有:
要達成上述情況,還是說一句概率特別低
刪除快取失敗的解決思路:
先刪除快取,再更新資料庫:
正常情況是這樣的:
如果原子性被破壞了:
看起來是很美好,但是我們在併發場景下分析一下,就知道還是有問題的了:
所以也會導致資料庫和快取不一致的問題。
併發下解決資料庫與快取不一致的思路:
對比一下兩種策略:
我們可以發現,兩種策略各自有優缺點:
先更新資料庫,再刪除快取(cache aside pattern
設計模式)
redis常見面試題
為什麼redis單執行緒還是這麼快?1.絕大部分的請求是純粹的記憶體操作 非常快速 2.採用單執行緒,避免了不必要的額競爭條件和上下文切換,單執行緒指的是網路請求模組使用的是乙個執行緒,即乙個執行緒處理了所有網路請求。3.非阻塞i o i o多路復用,這樣提高了redis的吞吐量,多路 指的是多個網...
Redis常見面試題
5.2.1 redis 是什麼?常 的應用場景?redis是乙個快取資料庫,是乙個非關係型資料庫的鍵值儲存資料庫 應用場景 內容快取,主要用於處理大量資料的高訪問負載 日誌系統5.2.2 redis 常 資料型別有哪些?各自有什麼應用場景?string 儲存的資料是普通的鍵值對可用string來進行...
Redis常見面試題
1 什麼是redis?簡述它的優缺點?1.redis本質上是乙個key value型別的記憶體資料庫,很像memcached。2.整個資料庫統統載入在記憶體當中進行操作,定期通過非同步操作把資料庫資料flush到硬碟上進行儲存。3.因為是純記憶體操作,redis的效能非常出色,每秒可以處理超過 10...