最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis緩存和Redis分布式鎖使用及說明

 更新時間:2026年05月25日 10:52:59   作者:陳同學(xué)呀  
這段描述融合了Redis緩存和Redis分布式鎖兩個核心關(guān)鍵詞,詳細介紹了它們在系統(tǒng)中的應(yīng)用場景、核心邏輯及典型場景,特別強調(diào)了兩者在數(shù)據(jù)一致性和生命周期上的區(qū)別,適合需要優(yōu)化系統(tǒng)性能和解決分布式系統(tǒng)布沖突的讀者

Redis 緩存 (Caching)

在Redis中,數(shù)據(jù)是以鍵值對的形式存儲的,其中鍵總是字符串類型,而值可以是多種數(shù)據(jù)類型。

目的

加速數(shù)據(jù)訪問,減少對慢速數(shù)據(jù)源(如數(shù)據(jù)庫)的頻繁查詢,提升系統(tǒng)性能和吞吐量。

核心邏輯

讀操作

  • 應(yīng)用優(yōu)先從 Redis 讀取數(shù)據(jù)。

  • 若 Redis 中無數(shù)據(jù)(緩存未命中),則查詢數(shù)據(jù)庫,并將結(jié)果寫入 Redis。

寫操作

  • 更新數(shù)據(jù)庫后,同步或異步更新/失效 Redis 中的緩存(如 DEL key 或 SET key new_value)。

存儲形式總結(jié)

數(shù)據(jù)類型底層實現(xiàn)最大元素數(shù)特點
StringSDS 動態(tài)字符串512 MB支持文本/二進制數(shù)據(jù)
Hash
  • 哈希表或 ziplist
2³²-1 個字段高效存儲對象屬性
List雙向鏈表/ziplist2³²-1 個元素保持插入順序
Set哈希表或 intset2³²-1 個元素自動去重
Sorted Set跳表 + 哈希表2³²-1 個元素按分數(shù)排序
GeospatialSorted Set同 Sorted Set支持地理坐標(biāo)計算
Streamrax 樹理論無上限支持消費者組
BitmapString2³² 位超高效布爾存儲
HyperLogLog專用結(jié)構(gòu)理論無上限固定12KB內(nèi)存存儲巨大基數(shù)
// 設(shè)置過期時間
db.KeyExpire("temp_data", TimeSpan.FromMinutes(30));

// 滑動過期
db.StringSet("session:1001", data, TimeSpan.FromMinutes(20), when: When.Always);

典型場景

  • 高頻讀取的熱點數(shù)據(jù)(如商品信息、用戶資料)
  • 減輕數(shù)據(jù)庫壓力
  • 加速 API 響應(yīng)

Redis 分布式鎖 (Distributed Lock)

目的

協(xié)調(diào)分布式系統(tǒng)中多個進程/服務(wù)的并發(fā)操作,確保同一時刻只有一個客戶端能執(zhí)行關(guān)鍵邏輯(如資源修改),避免數(shù)據(jù)競爭。

核心作用

Redis 分布式鎖用于解決分布式系統(tǒng)中的并發(fā)沖突問題,主要作用包括:

資源互斥訪問

確保多個服務(wù)實例/進程同時操作共享資源(如數(shù)據(jù)庫、文件)時,同一時刻只有一個客戶端能執(zhí)行關(guān)鍵代碼。

例:避免庫存超賣、重復(fù)支付、文件覆蓋等問題。

協(xié)調(diào)分布式任務(wù)

保證定時任務(wù)、批處理操作在集群環(huán)境中只被執(zhí)行一次。

防止并發(fā)副作用

避免多個請求同時修改同一數(shù)據(jù)導(dǎo)致狀態(tài)不一致

核心邏輯

加鎖

  • 客戶端嘗試在 Redis 中創(chuàng)建一個唯一鍵(如 lock:order_123),通過原子操作(如 SET key random_value NX PX 30000)確?;コ庑浴?/p>

執(zhí)行業(yè)務(wù)邏輯

  • 只有成功獲得鎖的客戶端才能執(zhí)行后續(xù)操作(如扣減庫存)。

解鎖

  • 完成后刪除該鍵(需通過 Lua 腳本驗證值,避免誤刪其他客戶端的鎖)。

典型場景

  • 分布式系統(tǒng)下的資源互斥訪問(如訂單支付、庫存扣減)

  • 防止重復(fù)任務(wù)調(diào)度(如定時任務(wù)只在一個節(jié)點執(zhí)行)

// 示例:使用 Redlock 或 StackExchange.Redis 鎖
var redisLock = _redis.AcquireLock("lock:order_123", TimeSpan.FromSeconds(30));
try
{
    if (redisLock.IsAcquired)
    {
        // 執(zhí)行業(yè)務(wù)邏輯(如扣減庫存)
        _stockService.ReduceStock(productId, 1);
    }
}
finally
{
    redisLock?.Release(); // 釋放鎖
}

類庫中用到的包是RedLockNet:

//鎖信息集合
var trayBarcodeLockInfos = new List<IRedLock>(); 
try
 {
   //獲取鎖
     var lockInfo = await _redLockLead.AcquireLockAsync(moveTrayBalance.TrayBarcode);

     _ = !lockInfo.IsAcquired ? throw new BusinessException(message: _localizer["_TrayBarcodeRequestExist", moveTrayBalance.TrayBarcode]) : false;

     trayBarcodeLockInfos.Add(lockInfo); //獲取鎖成功 將鎖加入集合中

  //執(zhí)行業(yè)務(wù)邏輯
  ··········

 }
 catch (BusinessException ex)
 {

 } 
finally
 {
    //釋放鎖
     foreach (var lockInfo in trayBarcodeLockInfos)
     {
         await _redLockLead.ReleaseLockAsync(lockInfo);
     }
 }

AcquireLockAsync() 獲取鎖 獲取不到返回失敗 

IsAcquired() 代表是否獲取鎖成功 

/// <summary>
/// 獲取鎖(獲取不到立即返回失敗)
/// </summary>
/// <param name="lockKey"></param>
/// <returns></returns>
public virtual async Task<IRedLock> AcquireLockAsync(string lockKey)
{
    var redLock = await _factoryProvider.RedLockFactoryInstance.CreateLockAsync(lockKey, _defaultKeyExpiry);
    return redLock;
}
/// <summary>
/// 獲取鎖(阻塞直到獲取鎖成功或者1h后仍獲取不到,返回失敗)
/// </summary>
/// <param name="lockKey"></param>
/// <returns></returns>
public virtual async Task<IRedLock> AcquireLockUntilSuccessAsync(string lockKey)
{
    var redLock = await _factoryProvider.RedLockFactoryInstance.CreateLockAsync(lockKey, _defaultKeyExpiry, _wait, _retry);
    return redLock;
}


public async Task<IRedLock> CreateLockAsync(string resource, TimeSpan expiryTime, TimeSpan waitTime, TimeSpan retryTime, CancellationToken? cancellationToken = null)
{
    return await RedLock.CreateAsync(loggerFactory.CreateLogger<RedLock>(), redisCaches, resource, expiryTime, waitTime, retryTime, configuration.RetryConfiguration, cancellationToken ?? CancellationToken.None).ConfigureAwait(continueOnCapturedContext: false);
}

默認為每10秒嘗試一次,在嘗試了一小時后還獲取不到鎖的話,就返回失敗

/// <summary>
/// 釋放鎖
/// </summary>
/// <param name="redLock"></param>
/// <returns></returns>
public virtual async Task ReleaseLockAsync(IRedLock redLock)
{
    await redLock.DisposeAsync();
}

核心區(qū)別總結(jié)

特性Redis 緩存Redis 分布式鎖
核心目標(biāo)提升讀取性能,降低數(shù)據(jù)庫壓力解決分布式系統(tǒng)并發(fā)沖突
數(shù)據(jù)性質(zhì)存儲業(yè)務(wù)數(shù)據(jù)(如用戶信息)存儲鎖狀態(tài)(臨時性、非業(yè)務(wù)數(shù)據(jù))
讀寫模式高頻讀、低頻寫短期占用、立即釋放
生命周期可長期存在(有過期時間)臨時存在(任務(wù)結(jié)束即釋放)
關(guān)鍵命令GET/SET/DEL/EXPIRESET NX PX/EVAL(Lua 解鎖)
數(shù)據(jù)一致性需處理緩存與數(shù)據(jù)庫一致性(如雙寫策略)需確保鎖的互斥性和安全性(如 Redlock)
  • 鎖是協(xié)調(diào)機制,不存儲業(yè)務(wù)數(shù)據(jù);緩存是數(shù)據(jù)副本,兩者不可互換。

  • 緩存僅加速數(shù)據(jù)讀取,無法控制并發(fā)寫操作(如超賣問題仍需分布式鎖或數(shù)據(jù)庫事務(wù))。

實際系統(tǒng)中二者常結(jié)合使用

  • 讀場景:用 Redis 緩存加速數(shù)據(jù)訪問。

  • 寫場景:用 Redis 分布式鎖保護共享資源,確保數(shù)據(jù)一致性。

適用場景不適用場景
庫存扣減/秒殺系統(tǒng)高頻短操作(鎖開銷 > 業(yè)務(wù)開銷)
分布式任務(wù)調(diào)度強一致性要求極高的金融交易
防止重復(fù)提交單機應(yīng)用(用 Monitor 即可)
跨服務(wù)共享資源協(xié)調(diào)讀多寫少場景(用樂觀鎖更優(yōu))

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于Redis的分布式鎖及原子性問題(短視頻開發(fā))

    基于Redis的分布式鎖及原子性問題(短視頻開發(fā))

    短視頻開發(fā)中,Redis分布式鎖通過SETNX實現(xiàn)加鎖與解鎖,需設(shè)置超時時間避免死鎖,為防止誤刪,釋放鎖時需判斷線程身份,并用Lua腳本保證原子性,確保安全操作,本文給大家介紹基于Redis的分布式鎖及原子性問題,感興趣的朋友一起看看吧
    2025-06-06
  • Redis MONITOR命令使用詳解

    Redis MONITOR命令使用詳解

    MONITOR是Redis提供的一個核心調(diào)試與審計命令,用于實時捕獲并打印服務(wù)器接收到的所有命令請求,本文就來介紹一下Redis MONITOR命令使用,感興趣的可以了解一下
    2025-11-11
  • Redis 命令整理并說明如何使用

    Redis 命令整理并說明如何使用

    這篇文章主要介紹了Redis 命令整理并說明如何使用的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 解決redis修改requirepass后不生效的問題

    解決redis修改requirepass后不生效的問題

    今天小編就為大家分享一篇解決redis修改requirepass后不生效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • redis保存AtomicInteger對象踩坑及解決

    redis保存AtomicInteger對象踩坑及解決

    這篇文章主要介紹了redis保存AtomicInteger對象踩坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 利用Redis實現(xiàn)SQL伸縮的方法

    利用Redis實現(xiàn)SQL伸縮的方法

    本文主要介紹了如何通過鎖和時間序列等方面來提升傳統(tǒng)數(shù)據(jù)庫的性能等方法,利用Redis實現(xiàn)SQL伸縮,供有需要的朋友們參考。
    2015-09-09
  • Redis不使用 keys 命令獲取鍵值信息的方法

    Redis不使用 keys 命令獲取鍵值信息的方法

    這篇文章主要介紹了Redis 不使用 keys 命令獲取鍵值信息的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-08-08
  • redis實現(xiàn)動態(tài)字符串SDS

    redis實現(xiàn)動態(tài)字符串SDS

    簡單動態(tài)字符串是Redis的基本數(shù)據(jù)結(jié)構(gòu)之一,用于存儲字符串和整型數(shù)據(jù),本文主要介紹了redis實現(xiàn)動態(tài)字符串SDS,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Redis統(tǒng)計獨立用戶訪問量的四種方案

    Redis統(tǒng)計獨立用戶訪問量的四種方案

    Redis 提供了多種數(shù)據(jù)結(jié)構(gòu)來高效實現(xiàn) UV 統(tǒng)計,各有優(yōu)劣,本文將詳細對比 Set、Bitmap、HyperLogLog、incr + 日期維度(即用戶提到的兩種方式)四種方案,并通過流程圖和代碼示例幫助你選型,需要的朋友可以參考下
    2026-04-04
  • 詳解Redis在SpringBoot工程中的綜合應(yīng)用

    詳解Redis在SpringBoot工程中的綜合應(yīng)用

    這篇文章主要介紹了Redis在SpringBoot工程中的綜合應(yīng)用,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10

最新評論

长宁区| 深泽县| 开化县| 盐边县| 湖南省| 四平市| 新闻| 望都县| 江永县| 大关县| 桓仁| 密云县| 嘉禾县| 林周县| 黄平县| 林甸县| 通州市| 厦门市| 来宾市| 连南| 本溪市| 同仁县| 襄汾县| 长沙市| 汝南县| 河津市| 康定县| 尚志市| 铜山县| 共和县| 沙湾县| 都江堰市| 金门县| 石阡县| 建昌县| 九江县| 濮阳县| 德昌县| 扎赉特旗| 印江| 武定县|