redis下并發問題解決方案

http://effective.blog.51cto.com/8296150/1671743

?

現在的計算機大都是多核的cpu,意味著可以并行執行多個進程.如果這多個運行的進程對同一份數據進行讀寫操作,那么就有可能出現兩個或者多個進程讀到的都是老的數據,這種情況下,再進行寫入操作之后就會有一些進程寫入的數據被覆蓋掉,就導致最終的結果錯誤.這份數據對于這些進程來說就是臨界區.

?

redis下處理并發問題.

1.通過使用setnx進行加鎖,在操作系統以及數據庫中處理并發都會用到鎖機制,雖然加鎖可以解決并發問題,但是會降低并發量,所以它們都會通過讀寫鎖來降低鎖的粒度.

? 加鎖實際上就是把并行讀寫改成串行讀寫的方式來避免資源競爭

1
2
3
4
5
6
7
8
9
10
11
$redis?=?new?Redis();
$redis->connect('127.0.0.1',?6370);
if(!$redis->setnx('lock',1)){
????usleep(500000);?//等待一段時間
????if(!$redis->setnx('lock',1)){
exit();
????}
}
redis->EXPIREAT('lock',?2);?//設置一個過期時間,避免進程掛掉導致鎖不能釋放
//業務處理
$redis->del('lock');

?

2.watch + 事物,redis的事物不能自動回滾,所以在失敗的情況下要處理回滾操作.如果事物中更新多個,那么回滾操作會比較麻煩,

1
2
3
4
5
6
7
8
$redis?=?new?Redis();
????????$redis->connect('127.0.0.1',?6370);
????????$redis->watch('test');?//必須在讀之前進行watch
$redis->hGetAll('test')
???????//業務處理
????????$result?=?$redis->multi()
????????????????????????->hset()
????????????????????????->exec();

?

3.減少寫數據的粒度或者修改數據結構來避免并發,我們的業務中使用的是hset方式,把用戶的數據都放到了一個filed中,這就導致一次更改要寫入用戶所有的數據,通過修改

使用hmset,更新數據的時候只更新需要更新的數據,降低寫入的粒度來降低各個接口對臨界區的讀寫訪問.這種方式或許能避免部分接口對臨界區的訪問,不能避免的接口還需要另外

處理.

?

4.在并發量過大的情況下,可以通過消息中間件進行處理,把并行讀寫進行串行化.這種方式在一些高并發的場景中算是一種通用的解決方案,簡單的方式可以通過redis的list實現,

在大規模的軟件中就需要引入專門的消息中間層來處理了.

轉載于:https://www.cnblogs.com/joshsung/p/7262335.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282917.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282917.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282917.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

宜建立自主可控的車用芯片和操作系統技術體系

萬物互聯時代,操作系統的邊界在不斷突破,面向“人機物”融合的泛在計算場景,能夠支撐分布式人機物協同應用的操作系統將是產業未來之光。操作系統在經過主機時代、PC互聯時代、移動互聯時代之后,來到萬物互聯時代,這恰…

Java 9進入第一輪問題修復階段

Java 9功能特性正式完成,這意味著第一個問題修復階段已經開始。HTTP/2客戶端沒有在截止日期前完成,現已降級為孵化器功能。由于現在的目標是在7月準備好可發布的Java 9,所以目前不太可能添加任何新的JEP。\\InfoQ此前的報道中提到&#xff0c…

django 用戶管理(1)

編輯了前端的頁面展示,用的bootstrap 用戶登錄 用戶信息 用戶編輯 創建用戶 修改密碼 轉載于:https://blog.51cto.com/jacksoner/2133129

qiaoye.php,全自動無限生成關鍵詞頁面(黑帽SEO優化終極方法)

如果你是做黑帽SEO的,如果你還停留在用欄目、租域名、劫持等手段來做黑帽SEO優化,我可以肯定的告訴你,你做的再好,也賺不了多少。那么今天咱們要說的就是無限生成關鍵詞頁面用內容頁來做黑帽SEO優化。這是我在演示的時候做的一個站…

AR Software

... 轉載于:https://www.cnblogs.com/2008nmj/p/7264769.html

v1.0.25 新版發布及Smart Meetup重新開啟丨SmartIDE

作者:徐磊文章首發地址:https://smartide.cn/zh/blog/2022-0892-sprint25/關于SmartIDESmartIDE是一群開發者為所有開發者開發的開源云原生IDE,我們的使命是“為開發者賦予云原生的超能力”!使用SmartIDE你只需要學會一個簡單的指…

線程安全的單例模式

面試的時候,常常會被問到這樣一個問題:請您寫出一個單例模式(Singleton Pattern)吧。好吧,寫就寫,這還不容易。順手寫一個: public final class EagerSingleton { private static EagerSi…

vue實現首屏加載等待動畫 避免首次加載白屏尷尬

為什么80%的碼農都做不了架構師?>>> 0 直接上效果圖 1背景,用戶體驗良好一直是個重要的問題。 2怎么加到自己項目里面? 復制css html代碼到自己的index.html即可 代碼鏈接 源碼地址 Vue學習前端群493671066,美女多多。…

java-回調機制詳解

轉:http://blog.csdn.net/llayjun/article/details/50454148 閱讀目錄 一、前言二、回調的含義和用途三、Java實現接口回調 四、Android中的接口回調五、參考資料一、前言 最近在看android fragment與Activity進行數據傳遞的部分,看到了接口回調的內容&a…

lfi讀取php,php LFI讀php文件源碼以及直接post webshell

php LFI讀php文件源碼以及間接post 網站shell假如如下一個場景(1) http://vulnerable/fileincl/example1.php?pageintro.php(該php文件包孕LFI漏洞)(2) 然而你不有中央能夠upload你的網站shell代碼(三) LFI只能讀取到非php文件的源碼(由于無…

根據請求上下文動態設置靜態文件存儲目錄

前言上次,我們實現了根據 subpath 特定格式《動態設置靜態文件存儲目錄》。例如:subpath靜態文件路徑/userAId/1.jpgc:\abc\userAId\1.jpg/userBId/1.jpgd:\xyz\123\userBId\1.jpg但是,如果 subpath 不能有這種特定格式,只能用通用…

BZOJ3019 : [Balkan2012]handsome

首先預處理出$f[i][j][k]$表示長度為$i$的序列,第一個位置是$j$,最后一個位置是$k$時合法的方案數。 從后往前枚舉LCP以及那個位置應該改成什么。 用線段樹維護區間內最左最右的已經確定的位置,以及區間內的合法方案數。 合并的時候只需要將左…

php smarty入門,smarty 快速入門

smarty 快速入門smarty定義:一個開源的模板引擎模板引擎是為了使用戶界面與業務數據分離而產生的,它可以生成特定格式的文檔,用于網站的模板引擎就會生成一個標準的HTML文檔。功能將網站的數據和網站的界面實現分離(php和html代碼)緩存頁面下載www.smart…

ImageView的scaleType理解

2019獨角獸企業重金招聘Python工程師標準>>> 1.android:scaleType“center” 保持原圖的大小,顯示在ImageView的中心。當原圖的size大于ImageView的size時,多出來的部分被截掉。 2.android:scaleType“center_inside” 以原圖正常顯示為目的&…

第一章 引論

1、什么是多道程序設計? 即內存中同時運行多道獨立程序,宏觀上所有程序同時運行,微觀上程序串行,多道程序輪流占用CPU,提高了資源利用率。 2、什么是SPOOLING?讀者是否認為將來的高級個人計算機會把SPOOLIN…

《ASP.NET Core 6框架揭秘》實例演示[24]:中間件的多種定義方式

ASP.NET Core的請求處理管道由一個服務器和一組中間件組成&#xff0c;位于 “龍頭” 的服務器負責請求的監聽、接收、分發和最終的響應&#xff0c;針對請求的處理由后續的中間件來完成。中間件最終體現為一個Func<RequestDelegate, RequestDelegate>委托&#xff0c;但…

Android之 RecyclerView,CardView 詳解和相對應的上拉刷新下拉加載

為什么80%的碼農都做不了架構師&#xff1f;>>> 隨著 Google 推出了全新的設計語言 Material Design&#xff0c;還迎來了新的 Android 支持庫 v7&#xff0c;其中就包含了 Material Design 設計語言中關于 Card 卡片概念的實現 —— CardView。RecyclerView也是谷…

php獲取郵箱內容嗎,php正則驗證email郵箱及抽取內容中email的例子

1&#xff0c;php正則驗證email格式&#xff1a;復制代碼 代碼示例:if (ereg(“/^[a-z]([a-z0-9]*[-_\.]?[a-z0-9])*([a-z0-9]*[-_]?[a-z0-9])[\.][a-z]{2,3}([\.][a-z]{2})?$/i; ”,$email)){echo “Your email address is correct!”;}else{echo “Please try again!”;}?…

Java——Arrays類操作數組的工具類

JDK中提供了一個專門用于操作數組的工具類&#xff0c;即 Arrays 類&#xff0c;位于 Java。util 包中。該類提供了一系列方法來操作數組&#xff0c;如排序、復制、比較、填充等&#xff0c;用戶直接調用這些方法即可&#xff0c;不需要自己編碼實現&#xff0c;降低了開發難度…

PropertiesUtil 獲取文件屬性值

有時候不要把一些屬性值寫死在代碼中&#xff0c;而是寫在配置在文件中&#xff0c;方便更改 PropertiesUtil工具類&#xff1a;讀取key-value形式的配置文件&#xff0c;根據key獲得value值 1、測試類 public class Test{private static PropertiesUtil propertiesUtil new …