1. 程式人生 > >redis你不得不知道的故事 分散式鎖三大注意事項

redis你不得不知道的故事 分散式鎖三大注意事項

點選上面藍字進行關注的都是靚仔和仙女由

我們在用快取的時候,不管是Redis或者Memcached,基本上會通用遇到以下三個問題:

  • 快取穿透

  • 快取併發

  • 快取失效

    快取穿透

640?wxfrom=5&wx_lazy=1

640?wxfrom=5&wx_lazy=1

0

上面三個圖會有什麼問題呢?

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

那這種問題有什麼好辦法解決呢?

要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。有一個比較巧妙的作法是,可以將這個不存在的key預先設定一個值。比如,"key" , “&&”。在返回這個&&值的時候,我們的應用就可以認為這是不存在的key,那我們的應用就可以決定是否繼續等待繼續訪問,還是放棄掉這次操作。如果繼續等待訪問,過一個時間輪詢點後,再次請求這個key,如果取到的值不再是&&,則可以認為這時候key有值了,從而避免了透傳到資料庫,從而把大量的類似請求擋在了快取之中。

快取併發

有時候如果網站併發訪問高,一個快取如果失效,可能出現多個程序同時查詢DB,同時設定快取的情況,如果併發確實很大,這也可能造成DB壓力過大,還有快取頻繁更新的問題。

我現在的想法是對快取查詢加鎖,如果KEY不存在,就加鎖,然後查DB入快取,然後解鎖;其他程序如果發現有鎖就等待,然後等解鎖後返回資料或者進入DB查詢。

這種情況和剛才說的預先設定值問題有些類似,只不過利用鎖的方式,會造成部分請求等待。

快取失效

引起這個問題的主要原因還是高併發的時候,平時我們設定一個快取的過期時間時,可能有一些會設定1分鐘啊,5分鐘這些,併發很高時可能會出在某一個時間同時生成了很多的快取,並且過期時間都一樣,這個時候就可能引發一當過期時間到後,這些快取同時失效,請求全部轉發到DB,DB可能會壓力過重。

那如何解決這些問題呢?

其中的一個簡單方案就時講快取失效時間分散開,比如我們可以在原有的失效時間基礎上增加一個隨機值,比如1-5分鐘隨機,這樣每一個快取的過期時間的重複率就會降低,就很難引發集體失效的事件。

我們討論的第二個問題時針對同一個快取,第三個問題時針對很多快取。

總結來看

1、快取穿透:查詢一個必然不存在的資料。比如文章表,查詢一個不存在的id,每次都會訪問DB,如果有人惡意破壞,很可能直接對DB造成影響。

2、快取失效:如果快取集中在一段時間內失效,DB的壓力凸顯。這個沒有完美解決辦法,但可以分析使用者行為,儘量讓失效時間點均勻分佈。當發生大量的快取穿透,例如對某個失效的快取的大併發訪問就造成了快取雪崩。

網上提問彙總

如何解決DB和快取一致性問題?

答:當修改了資料庫後,有沒有及時修改快取。這種問題,以前有過實踐,修改資料庫成功,而修改快取失敗的情況,最主要就是快取伺服器掛了。而因為網路問題引起的沒有及時更新,可以通過重試機制來解決。而快取伺服器掛了,請求首先自然也就無法到達,從而直接訪問到資料庫。那麼我們在修改資料庫後,無法修改快取,這時候可以將這條資料放到資料庫中,同時啟動一個非同步任務定時去檢測快取伺服器是否連線成功,一旦連線成功則從資料庫中按順序取出修改資料,依次進行快取最新值的修改。

多級快取是什麼概念呢?

答:多級快取就是將ehcache與redis做二級快取,就像我之前寫的文章也提到過。但同樣會存在一致性問題,如果我們需要強一致性的話,快取與資料庫同步是會存在時間差的,所以我們在具體開發的過程中,一定要根據場景來具體分析,二級快取更多的解決是,快取穿透與程式的健壯性,當集中式快取出現問題的時候,我們的應用能夠繼續執行。

想更加詳細,更加深入的瞭解快取擊穿嗎?

在這裡部落告訴大家一個小祕密

今晚8:30

動腦學院  Lison大神

將在騰訊課堂  動腦學院  免費Java公開課中

給大家詳細講解

《 redis你不得不知道的故事 分散式鎖三大注意事項 》

你只需要在今晚8:30的時候

點選文章最末 閱讀原文

即可進行觀看

推薦閱讀  

推薦程式設計師必備微訊號 

相關推薦

redis不得不知道故事 分散式三大注意事項

點選上面藍字進行關注的都是靚仔和仙女由我們在用快取的時候,不管是Redis或者Memcached

作為前端,不得不知道的搜索引擎優化

原創 取數據 多少 是我 div pen 鏈接 error site 今天在看文章時,看到了這篇文章。自己對搜索引擎優化了解並不是深入,以此分享給大家。 向搜索引擎提交網站地址:http://www.runoob.com/web/web-search.html 文章原文

應屆生求職程序員崗位不得不知道的一些事

程序開發 前端開發 css3 一點 後臺語言 ... 掌握 決定 在線筆試題 本人面試的是前端開發崗位,坐標上海,目前面試過了5家IT公司,2家社招、3家校招、通過這幾次面試,自己得到了成長,也想把面試的一些經驗分享給大家,希望對大家會有一點幫助。 先說說頭兩次社招面

如果想搞懂“分散式”,必須要看這篇文章 ,看了很意外!

對於鎖大家肯定不會陌生,在 Java 中 synchronized 關鍵字和 ReentrantLock 可重入鎖在我們的程式碼中是經常見的,一般我們用其在多執行緒環境中控制對資源的併發訪問。 但是隨著分散式的快速發展,本地的加鎖往往不能滿足我們的需要,在我們的分散式環境中上面加鎖的方法

Redis系列-生產應用篇-分散式(5)-單程序Redis分散式的Java實現(Redisson使用與底層實現)-原子

Redisson單程序Redis分散式樂觀鎖的使用與實現 本文基於Redisson 3.7.5 4. 原子鎖類 Redisson中實現了兩種原子鎖類:RAtomicLong和RAtomicDouble,還有RLongAdder和RDoubleAdder RA

http不得不知道的那些事(六)--請求響應細節

http相關的東西也寫了好幾篇了,但是一直都在涉及http周邊的東西,最核心最底層的沒有涉及到。本篇就要揭開網路請求的神祕面紗,將最底層的東西以最簡單的方式呈現給大家。 那就得先講講OSI七層模型,OSI(Open System Interconnect),即

http不得不知道的那些事(一)--同源策略(1)

前段時間詳細的學習了一下http相關的東西,特別是看了http權威指南,感覺收穫良多,在未來的一段時間我將把自己所學到的相關東西分享出來,先撿重要的(我自認為的)來說。本章講述同源策略,希望對大家有所

redis操作快取來實現分散式例項

目前幾乎所有的大型網站及應用都是採用分散式部署的方式,分散式系統開發帶來的優點很多,高可用,高併發,水平擴充套件,分開部署等。但分散式的開發也帶來了一些新問題,有的時候,我們需要保證一個方法在同一時間內

不得不知道的 MySQL 優化原理

說起MySQL的查詢優化,相信大家收藏了一堆奇淫技巧:不能使用SELECT *、不使用NULL欄位、合理建立索引、為欄位選擇合適的資料型別….. 你是否真的理解這些優化技巧?是否理解其背後的工作原理?在實際場景下效能真有提升嗎?我想未必。因而理解這些優化建議背後的原理就尤

38、分散式是啥?對比下redis和zk兩種分散式的優劣?

1、面試題 一般實現分散式鎖都有哪些方式?使用redis如何設計分散式鎖?使用zk來設計分散式鎖可以嗎?這兩種分散式鎖的實現方式哪種效率比較高? 2、面試官心裡分析 其實一般問問題,都是這麼問的,先問問你zk,然後其實是要過度的zk關聯的一些問題裡去,比如分散式鎖。因為在分散式系統開發中

【轉】基於Redis Lua指令碼實現的分散式(Java實現)

最近專案中需要用到一個分散式的鎖,考慮到基於會話節點實現的zookeeper鎖效能不夠,於是想使用redis來實現一個分散式的鎖。看了網上的幾個實現方案後,發現都不夠嚴謹。比如這篇:用Redis實現分散式鎖裡面設計的鎖有個最大的問題是鎖的超時值TTL會一直被改寫

關於磁珠在PCB應用中不得不知道的這幾點

  2。普通濾波器是由無損耗的電抗元件構成的,它線上路中的作用是將阻帶頻率反射回訊號源,所以這類濾波器又叫反射濾波器。當反射濾波器與訊號源阻抗不匹配時,就會有一部分能量被反射回訊號源,造成干擾電平的增強。為解決這一弊病,可在濾波器的進線上使用鐵氧體磁環或磁珠套,利用滋環或磁珠對高頻訊號的渦流損耗,把高頻成分

五分鐘瞭解不得不知道的人工智慧熱門詞彙

編者按:大資料和人工智慧的浪潮正在席捲全球,眾多熱門詞彙蜂擁而至:人工智慧(Artificial Intelligence)、大資料(Big Data)、雲端計算(Cloud Computing)、機器學習(Machine Learning)、資料探勘(Data Mining)、深度學習(Dee

9項不得不知道的Kubernetes安全最佳實踐

放棄 帳戶 建立 安全相關 命名 創建 高版本 元數據 osc 上個月,全球最受歡迎的容器編排引擎Kubernetes,被爆出首個嚴重的安全漏洞,使得整個Kubernetes生態發生震蕩。該漏洞(CVE-2018-1002105)使***者能夠通過Kubernetes AP

Spring3.2和java8,不得不知道的事

問題來源: 最近重灌了系統,整了個java8玩玩。然後,就是悲劇上演了 以前的一個專案,什麼都沒改,直接執行,然後就: 沒有其它具體有用的提示,就是說Spring 的context和Listener都啟動不了。 首先想到,難道web.xml配置出錯啦?為什麼在Spr

MySQL中關於JSON不得不知道的那些事!

MySQL新增的JSON資料型別讓關係資料庫用起來更簡單,並且模糊了SQL和NoSQL資料庫的界限。 從前有了一臺電腦,然後有人built了第二臺電腦,並且想要一些第一臺電腦上的程式碼。這就意味著我們需要一種不借助底層硬體的方式來移動資訊。

關於javascript不得不知道歷史

注:本文主要是針對javaScript的初學者。<本文參考《javaScript高階程式設計》> 我們經常提到的javascript,相信看到這篇文章的人大家都熟悉,但不一定你對它的一些歷史就一定了解,當然作為一個合格的前端開發人員來說,javaScript是必

Redis實現分散式全域性Redis客戶端Redisson中分散式RLock實現

1. 前因     以前實現過一個Redis實現的全域性鎖, 雖然能用, 但是感覺很不完善, 不可重入, 引數太多等等.     最近看到了一個新的Redis客戶端Redisson, 看了下原始碼, 發現了一個比較好的鎖實現RLock, 於是記錄下. 2. Maven依

關於Spring Boot不得不知道的事

1 Spring Boot官網[2.1.5 CURRENT GA] 1.1 Pivotal Wiki Pivotal

網際網路公司面試經——不得不知道的雜湊表

前言     雜湊表,又名散列表。是非常常用的一種資料結構,C#的Hashtable、字典,Java的HashMap,Redis的Hash,其底層實現都是散列表。而在一些網際網路公司的面試中,更是技術面試官們必問的一道題目。本文將簡單瞭解雜湊表(散列表)這種資料結構。 一、散列表 1.1 散列表     散列