Redis的中併發問題的解決方案小結

来源:https://www.cnblogs.com/lys_013/archive/2019/01/02/10207609.html
-Advertisement-
Play Games

什麼是Redis的併發競爭問題 Redis的併發競爭問題,主要是發生在併發寫競爭。考慮到redis沒有像db中的sql語句,update val = val + 10 where ...,無法使用這種方式進行對數據的更新。 假如有某個key(mileage), value(10),現在想把value ...


什麼是Redis的併發競爭問題

Redis的併發競爭問題,主要是發生在併發寫競爭。考慮到redis沒有像db中的sql語句,update val = val + 10 where ...,無法使用這種方式進行對數據的更新。

假如有某個key(mileage),  value(10),現在想把value值進行+10操作。正常邏輯下,就是先把數據key為mileage的值讀回來,加上10,再把值給設置回去。

如果只有一個連接的情況下,這種方式沒有問題,可以工作得很好,但如果有兩個連接時,兩個連接同時想對還mileage進行+10操作,就可能會出現問題了。

例如:兩個連接同時對mileage進行寫操作,同時加10,最終結果我們知道,應該為30才是正確。

考慮到一種情況:

T1時刻,連接1將mileage讀出,目標設置的數據為10+10 = 20。

T2時刻,連接2也將數據讀出,也是為10,目標設置為20。

T3時刻,連接1將mileage設置為20。

T4時刻,連接2也將mileage設置為20,則最終結果是一個錯誤值20。

另外假設有個A線程正在寫mileage,B線程正在讀寫mileage,當A,B同時執行的時候也可能發生併發競爭問題:

即B將mileage值讀出來的時候,A正好更新了mileage值,然後B又更新回mileage值,此時照成A的更新無效。

解決方案

方案1

利用redis自帶的incr命令,具體用法看這裡http://doc.redisfans.com/string/incr.html。

方案2

利用redis的setnx實現內置的鎖。

方案3

使用樂觀鎖的方式進行解決(成本較低,非阻塞,性能較高)。如何用樂觀鎖方式進行解決?本質上是假設不會進行衝突,使用redis的命令watch進行構造條件。偽代碼如下:

複製代碼
watch mileage
get mileage $mileage
$mileage = $mileage + 10
multi
set mileage $mileage
exec
複製代碼

解釋一下:

watch這裡表示監控該key值,後面的事務是有條件的執行,如果從watch的exec語句執行時,watch的key對應的value值被修改了,則事務不會執行。

具體看Redis的事務功能詳解這篇文章里的watch命令介紹。

方案4

這個是針對同一個服務的客戶端來的,在代碼里要對redis操作的時候,針對同一key的資源,就先進行加鎖(java里的synchronized或lock)。

方案5

可以使用獨占鎖的方式,類似操作系統的mutex機制。(網上有例子,http://blog.csdn.net/black_ox/article/details/48972085 不過實現相對複雜,成本較高)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 列舉了MySQL主從複製主要的相關參數 binlog server_id 伺服器在集群中唯一標識符 log_bin[=binlog_name] 啟動二進位日誌 log_bin_index 二進位日誌索引名稱 binlog_format 二進位日誌的類型 binlog_row_image 二進位鏡像保 ...
  • 本文我們來談談項目中常用的MySQL優化方法,共19條,具體如下: 1、EXPLAIN 做MySQL優化,我們要善用EXPLAIN查看SQL執行計劃。 下麵來個簡單的示例,標註(1、2、3、4、5)我們要重點關註的數據: type列,連接類型。一個好的SQL語句至少要達到range級別。杜絕出現al ...
  • 簡單的SQL語句增刪改查操作 說明: 在mysql裡面親測結果正確 用到的表(學生表:studnets) 1.創建一個學生表,(學號,姓名,性別,家庭住址) mysql> create table students -> ( -> studentId int(11) not null primary ...
  • 刪除登陸賬戶註意事項 不能刪除正在登錄的登錄名。 也不能刪除擁有任何安全對象、伺服器級對象或 SQL Server 代理作業的登錄名。 可以刪除資料庫用戶映射到的登錄名,但是這會創建孤立用戶。 有關詳細信息,請參閱 孤立用戶故障排除 (SQL Server)。 在 SQL Database中,對連接 ...
  • 本文由雲+社區發表 文章《MySQL查詢分析》講述了使用MySQL慢查詢和explain命令來定位mysql性能瓶頸的方法,定位出性能瓶頸的sql語句後,則需要對低效的sql語句進行優化。本文主要討論MySQL索引原理及常用的sql查詢優化。 一個簡單的對比測試 前面的案例中,c2c_zwdb.t_ ...
  • 場景: Aix 7.2 上安裝Oracle 18.4 RAC 執行root.sh腳本,ASM failed to start !查看日誌文件:ORA-40238: invalid linear algebra shared library /u01/app/oracle/product/18.0.0 ...
  • MySQL資料庫設計規範 目錄 1. 規範背景與目的 MySQL資料庫與 Oracle、 SQL Server 等資料庫相比,有其內核上的優勢與劣勢。我們在使用MySQL資料庫的時候需要遵循一定規範,揚長避短。本規範旨在幫助或指導RD、QA、OP等技術人員做出適合線上業務的資料庫設計。在資料庫變更和 ...
  • 【作者】 劉博:攜程技術保障中心資料庫高級經理,主要關註Sql server和Mysql的運維和故障處理。 【環境】 版本號:5.6.21 隔離級別:REPEATABLE READ 【問題描述】 接到監控報警,有一個線上的應用DeadLock報錯,每15分鐘會準時出現,報錯統計如下圖: 登錄Mysq ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...