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

Redis分布式鎖中8個(gè)常見(jiàn)面試題小結(jié)

 更新時(shí)間:2026年03月09日 10:03:10   作者:小壞說(shuō)Java  
本文主要介紹了Redis分布式鎖中8個(gè)常見(jiàn)面試題小結(jié),包括使用Redis、RedLock算法和ZooKeeper等工具,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

?? 1. 為什么需要分布式鎖?

場(chǎng)景:雙11秒殺,10000人搶100個(gè)商品

  • 單機(jī)鎖不行:秒殺系統(tǒng)有10臺(tái)服務(wù)器,每臺(tái)都有自己的內(nèi)存,鎖不住其他服務(wù)器
  • 需要共享的鎖:所有服務(wù)器都能訪(fǎng)問(wèn)的鎖 → Redis分布式鎖

?? 2. 最簡(jiǎn)單的分布式鎖怎么寫(xiě)?(錯(cuò)誤示范)

// ? 新手最容易寫(xiě)的錯(cuò)誤代碼
public boolean lock(String key) {
    String result = jedis.setnx(key, "1");  // 嘗試加鎖
    return result == 1;  // 1表示加鎖成功
}

public void unlock(String key) {
    jedis.del(key);  // 刪除鎖
}

?? 問(wèn)題在哪里?

  1. 死鎖風(fēng)險(xiǎn):如果程序崩潰,鎖永遠(yuǎn)不釋放
  2. 誤刪別人鎖:A的鎖超時(shí)釋放,B獲得鎖,A醒來(lái)刪了B的鎖

?? 3. 怎么設(shè)置過(guò)期時(shí)間?(還是不對(duì))

// ? 這個(gè)也有問(wèn)題
public boolean lock(String key, int seconds) {
    // 兩步操作:1.加鎖 2.設(shè)置過(guò)期時(shí)間
    Long result = jedis.setnx(key, "1");
    if (result == 1) {
        jedis.expire(key, seconds);  // 設(shè)置過(guò)期
        return true;
    }
    return false;
}

?? 問(wèn)題:兩步不是原子的!

  • 如果setnx成功,但expire前程序崩潰 → 鎖變永久的!

?? 4. 正確寫(xiě)法是怎樣的?

// ? 正確的加鎖(一步完成)
public boolean lock(String key, String value, int seconds) {
    // 一條命令完成:加鎖+設(shè)置過(guò)期時(shí)間
    String result = jedis.set(key, value, "NX", "EX", seconds);
    return "OK".equals(result);
}

// ? 安全的解鎖
public void unlock(String key, String value) {
    // 用Lua腳本保證原子操作:檢查值再刪除
    String script = 
        "if redis.call('get', KEYS[1]) == ARGV[1] then " +
        "   return redis.call('del', KEYS[1]) " +
        "else " +
        "   return 0 " +
        "end";
    
    jedis.eval(script, 1, key, value);
}

? 關(guān)鍵點(diǎn):

  1. 一條命令SET key value NX EX seconds
  2. value用唯一標(biāo)識(shí):UUID或線(xiàn)程ID
  3. 原子刪除:用Lua腳本檢查再刪除

?? 5. 鎖的value為什么不能用"1"?

// ? 錯(cuò)誤:大家value都一樣
jedis.set("lock", "1", "NX", "EX", 10);

// ? 正確:每人一個(gè)唯一標(biāo)識(shí)
String myId = UUID.randomUUID().toString();
jedis.set("lock", myId, "NX", "EX", 10);

場(chǎng)景演示:

線(xiàn)程A:獲得鎖,value="A123",超時(shí)10秒
線(xiàn)程A:執(zhí)行了15秒(鎖在第10秒已過(guò)期)
線(xiàn)程B:獲得鎖,value="B456"
線(xiàn)程A:終于執(zhí)行完,要?jiǎng)h除鎖 → 刪了線(xiàn)程B的鎖!?

?? 6. 業(yè)務(wù)沒(méi)執(zhí)行完,鎖過(guò)期了怎么辦?

方案1:設(shè)置合理的過(guò)期時(shí)間

// 評(píng)估業(yè)務(wù)時(shí)間,設(shè)置更長(zhǎng)過(guò)期
jedis.set("lock", uuid, "NX", "EX", 30);  // 設(shè)置30秒

方案2:自動(dòng)續(xù)期(看門(mén)狗)

// 啟動(dòng)一個(gè)線(xiàn)程,定期續(xù)期
new Thread(() -> {
    while (業(yè)務(wù)沒(méi)執(zhí)行完) {
        Thread.sleep(8000);  // 8秒續(xù)一次
        
        // 如果是自己的鎖,就延長(zhǎng)過(guò)期時(shí)間
        jedis.expire("lock", 10);
    }
}).start();

?? 7. Redis主從切換會(huì)丟鎖嗎?

會(huì)!這是Redis分布式鎖的最大問(wèn)題

場(chǎng)景:

1. 線(xiàn)程A在主節(jié)點(diǎn)獲得鎖
2. 主節(jié)點(diǎn)宕機(jī)(鎖數(shù)據(jù)還沒(méi)同步到從節(jié)點(diǎn))
3. 從節(jié)點(diǎn)變成新主節(jié)點(diǎn)
4. 線(xiàn)程B在新主節(jié)點(diǎn)獲得"相同"的鎖
結(jié)果:A和B同時(shí)持有了鎖!

解決方案:

  1. 用RedLock算法:在多個(gè)Redis實(shí)例上加鎖
  2. 用ZooKeeper:更適合分布式鎖
  3. 接受風(fēng)險(xiǎn):業(yè)務(wù)上做冪等處理

?? 8. 實(shí)際開(kāi)發(fā)用什么?(不要造輪子?。?/h2>
// 使用Redisson框架(最省心)
RedissonClient redisson = Redisson.create();
RLock lock = redisson.getLock("myLock");

try {
    lock.lock();  // 加鎖(自動(dòng)續(xù)期)
    // 執(zhí)行業(yè)務(wù)...
} finally {
    lock.unlock();  // 解鎖
}

?? 面試對(duì)比表

方案優(yōu)點(diǎn)缺點(diǎn)適用場(chǎng)景
Redis單節(jié)點(diǎn)簡(jiǎn)單、快主從切換丟鎖測(cè)試環(huán)境、不重要的鎖
RedLock相對(duì)可靠實(shí)現(xiàn)復(fù)雜、性能差重要的業(yè)務(wù)鎖
Redisson功能全、自動(dòng)續(xù)期依賴(lài)框架推薦的生產(chǎn)方案
ZooKeeper最可靠性能較差強(qiáng)一致性的場(chǎng)景

? 面試常見(jiàn)問(wèn)題

Q1: "說(shuō)一下Redis分布式鎖的實(shí)現(xiàn)原理"

:"用SET命令的NX和EX參數(shù),NX保證只有一個(gè)能設(shè)置成功,EX設(shè)置過(guò)期時(shí)間防止死鎖。刪除時(shí)用Lua腳本原子操作,避免刪別人鎖。"

Q2: "Redis鎖和ZooKeeper鎖的區(qū)別?"

  • Redis:AP系統(tǒng),性能好,但可能丟鎖
  • ZooKeeper:CP系統(tǒng),可靠但性能差
  • 選擇:要高性能用Redis,要可靠性用ZooKeeper

Q3: "怎么實(shí)現(xiàn)可重入鎖?"

:"在value里記錄線(xiàn)程ID和重入次數(shù)。加鎖時(shí)如果是同一線(xiàn)程,計(jì)數(shù)+1;解鎖時(shí)計(jì)數(shù)-1,計(jì)數(shù)為0才真正刪除鎖。"

?? 記住三句話(huà)

  1. 加鎖要原子SET key uuid NX EX seconds
  2. 解鎖要安全:用Lua腳本先檢查再刪除
  3. 生產(chǎn)別造輪子:直接用Redisson

?? 快速檢查清單

你的分布式鎖:

  • 設(shè)置過(guò)期時(shí)間了嗎?
  • value是唯一的嗎?
  • 刪除前檢查value了嗎?
  • 考慮鎖續(xù)期了嗎?
  • 知道主從切換會(huì)丟鎖嗎?

滿(mǎn)足這5條,面試官就難不倒你了!

到此這篇關(guān)于Redis分布式鎖中8個(gè)常見(jiàn)面試題小結(jié)的文章就介紹到這了,更多相關(guān)Redis分布式鎖面試題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于在Redis中使用Pipelining加速查詢(xún)的問(wèn)題

    關(guān)于在Redis中使用Pipelining加速查詢(xún)的問(wèn)題

    這篇文章主要介紹了在Redis中使用Pipelining加速查詢(xún),Redis是一個(gè)client-server模式的TCP服務(wù),也被稱(chēng)為Request/Response協(xié)議的實(shí)現(xiàn),本文通過(guò)一個(gè)例子給大家詳細(xì)介紹,感興趣的朋友一起看看吧
    2022-05-05
  • 淺談Redis中的自動(dòng)過(guò)期機(jī)制

    淺談Redis中的自動(dòng)過(guò)期機(jī)制

    本文主要介紹了淺談Redis中的自動(dòng)過(guò)期機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 內(nèi)存型數(shù)據(jù)庫(kù)Redis持久化小結(jié)

    內(nèi)存型數(shù)據(jù)庫(kù)Redis持久化小結(jié)

    redis是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫(kù),也就是說(shuō)redis需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到磁盤(pán)來(lái)保證持久化.redis支持四種持久化方式,一是 Snapshotting(快照)也是默認(rèn)方式,二是Append-only file(縮寫(xiě)aof)的方式,三是虛擬內(nèi)存方式,四是diskstore方式.今天我們總結(jié)下前2種。
    2017-09-09
  • windows平臺(tái)安裝部署Redis

    windows平臺(tái)安裝部署Redis

    Redis是一個(gè)開(kāi)源、跨平臺(tái)的數(shù)據(jù)庫(kù),因此Redis數(shù)據(jù)庫(kù)可以運(yùn)行在Windows、Linux、Mac OS和BSD等多個(gè)平臺(tái)上,本文主要介紹了windows平臺(tái)安裝部署Redis,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • redis配置文件中常用配置詳解

    redis配置文件中常用配置詳解

    這篇文章主要介紹了redis配置文件中常用配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Windows中redis設(shè)置密碼的兩種方法

    Windows中redis設(shè)置密碼的兩種方法

    之前寫(xiě)的一個(gè)項(xiàng)目,有項(xiàng)目代碼,有數(shù)據(jù)庫(kù),但是本地沒(méi)redis,沒(méi)法跑此項(xiàng)目,故思考在本地安裝一個(gè)redis做登錄session存儲(chǔ),所以開(kāi)始動(dòng)手實(shí)踐,下面這篇文章主要給大家介紹了關(guān)于Windows中redis設(shè)置密碼的兩種方法,需要的朋友可以參考下
    2023-04-04
  • Redis中ziplist壓縮列表的實(shí)現(xiàn)

    Redis中ziplist壓縮列表的實(shí)現(xiàn)

    本文主要介紹了Redis中ziplist壓縮列表的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Redis 的各項(xiàng)功能主要解決了什么問(wèn)題

    Redis 的各項(xiàng)功能主要解決了什么問(wèn)題

    Redis是一個(gè)基于BSD開(kāi)源的項(xiàng)目,是一個(gè)把結(jié)構(gòu)化的數(shù)據(jù)放在內(nèi)存中的一個(gè)存儲(chǔ)系統(tǒng),你可以把它作為數(shù)據(jù)庫(kù),緩存和消息中間件來(lái)使用。這篇文章主要介紹了Redis 的各項(xiàng)功能主要解決了什么問(wèn)題,需要的朋友可以參考下
    2018-10-10
  • redisTemplate.opsForValue().get()獲取值失敗的解決方案

    redisTemplate.opsForValue().get()獲取值失敗的解決方案

    文章討論了在使用RedisTemplate時(shí)遇到get()方法返回null的問(wèn)題,并分析了原因,作者建議使用@Autowired注解進(jìn)行依賴(lài)注入,特別是推薦通過(guò)構(gòu)造函數(shù)注入,以避免類(lèi)型無(wú)法分辨的問(wèn)題,文章最后總結(jié)了這些經(jīng)驗(yàn),并鼓勵(lì)讀者參考和使用
    2026-03-03
  • 在ssm項(xiàng)目中使用redis緩存查詢(xún)數(shù)據(jù)的方法

    在ssm項(xiàng)目中使用redis緩存查詢(xún)數(shù)據(jù)的方法

    本文主要簡(jiǎn)單的使用Java代碼進(jìn)行redis緩存,即在查詢(xún)的時(shí)候先在service層從redis緩存中獲取數(shù)據(jù)。如果大家對(duì)在ssm項(xiàng)目中使用redis緩存查詢(xún)數(shù)據(jù)的相關(guān)知識(shí)感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-03-03

最新評(píng)論

泰安市| 合川市| 叶城县| 绵竹市| 惠州市| 湖南省| 长沙县| 循化| 新兴县| 新郑市| 临猗县| 永宁县| 濉溪县| 鱼台县| 和顺县| 昌都县| 盱眙县| 嘉鱼县| 南华县| 威海市| 泾川县| 勃利县| 武城县| 会泽县| 德令哈市| 苏尼特右旗| 城市| 温州市| 孝感市| 越西县| 山阳县| 永济市| 张家界市| 宁陕县| 正蓝旗| 长汀县| 靖西县| 和林格尔县| 荃湾区| 吉木乃县| 西乌珠穆沁旗|