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

redis實(shí)現(xiàn)簡單分布式鎖

 更新時(shí)間:2024年07月01日 11:46:44   作者:呱呱123#  
這篇文章主要介紹了redis實(shí)現(xiàn)簡單分布式鎖,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下

1.redisTemplate實(shí)現(xiàn)簡單分布式鎖

 @Autowired
    RedisTemplate redisTemplate;
 
    /**
     * redis分布式鎖演示案例,此處使用redisTemplate
     * @param stockId  此處以扣減庫存為例子,stockId代表要扣減庫存的商品id,庫存數(shù)據(jù)是提前存在redis的,并和數(shù)據(jù)庫進(jìn)行同步
     * @return
     */
    public AjaxResult redisLockDemo(String stockId){
        //鎖前綴
        final String stock_lock = "stock_lock:";
        // 生成一個(gè)隨機(jī)唯一的值用于辨別鎖的使用對象
        String clientId = UUID.randomUUID().toString();
        //此處使用set(k,v,time,unit)來獲取鎖,確保加鎖和設(shè)置超時(shí)時(shí)間是原子操作
        Boolean lock = redisTemplate.opsForValue().setIfAbsent(stock_lock + stockId, clientId, 10, TimeUnit.MILLISECONDS);
        if (!lock){
            //獲取鎖失敗
            return AjaxResult.error("服務(wù)器繁忙,請稍后再試!");
        }
        //獲取鎖成功
        //執(zhí)行扣減庫存
        try {
            int stock = (int) redisTemplate.opsForValue().get(stockId);
            if (stock > 0){
                int realStock = stock - 1;
                // 重新設(shè)置庫存數(shù)據(jù)
                redisTemplate.opsForValue().set(stockId, realStock + "");
                // .............其他步驟
                log.info("庫存扣減成功{}", stockId);
            } else {
                return AjaxResult.error("商品已經(jīng)被搶光了!");
            }
        } finally {
           //釋放鎖
//            if (clientId.equals(stringRedisTemplate.opsForValue().get(stock_lock + stockId))){
//                stringRedisTemplate.delete(stock_lock + stockId);
//            }
            //此處使用lua腳本釋放鎖,具有原子性
            String script = "local lockKey = KEYS[1]\n" +
                    "local clientId = ARGV[1]\n" +
                    "local currentHolder = redis.call('GET', lockKey)\n" +
                    "if currentHolder == clientId then\n" +
                    "    redis.call('DEL', lockKey)\n" +
                    "    return true\n" +
                    "else\n" +
                    "    return false\n" +
                    "end";
            DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>(script, Boolean.class);
            Boolean result = (Boolean) redisTemplate.execute(redisScript, Collections.singletonList(stock_lock + stockId), clientId);
 
            if (result != null && result) {
               log.info("所釋放成功");
            } else {
                log.info("所釋放失敗");
            }
        }
        return AjaxResult.success("扣減庫存成功!");
    }

2.redission實(shí)現(xiàn)分布式鎖

    @Autowired
    Redisson redisson; 
/**
     * redis分布式鎖演示案例,redisson
     * @param stockId  此處以扣減庫存為例子,stockId代表要扣減庫存的商品id,庫存數(shù)據(jù)是提前存在redis的,并和數(shù)據(jù)庫進(jìn)行同步
     * @return
     */
    public AjaxResult redissonLockDemo(String stockId){
        final String lockKey = "stock_lock:";
        RLock lock = redisson.getLock(lockKey);
        lock.lock();
        try {
            //執(zhí)行扣減庫存
            int stock = (int) redisTemplate.opsForValue().get(stockId);
            if (stock > 0){
                int realStock = stock - 1;
                // 重新設(shè)置庫存數(shù)據(jù)
                redisTemplate.opsForValue().set(stockId, realStock + "");
                // .............其他步驟
                log.info("庫存扣減成功{}", stockId);
            } else {
                return AjaxResult.error("商品已經(jīng)被搶光了!");
            }
        }finally {
            lock.unlock();
        }
        return AjaxResult.success("扣減庫存成功!");
    }

以上就是redis實(shí)現(xiàn)簡單分布式鎖的詳細(xì)內(nèi)容,更多關(guān)于redis分布式鎖的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • redis輕松處理經(jīng)緯度坐標(biāo)點(diǎn)數(shù)據(jù)的實(shí)現(xiàn)方法

    redis輕松處理經(jīng)緯度坐標(biāo)點(diǎn)數(shù)據(jù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了redis輕松處理經(jīng)緯度坐標(biāo)點(diǎn)數(shù)據(jù)的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 詳解Centos7下配置Redis并開機(jī)自啟動(dòng)

    詳解Centos7下配置Redis并開機(jī)自啟動(dòng)

    本篇文章主要介紹了Centos7下配置Redis并開機(jī)自啟動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • 5分鐘教你docker安裝啟動(dòng)redis全教程(全新方式)

    5分鐘教你docker安裝啟動(dòng)redis全教程(全新方式)

    今天,我來帶大家使用一種全新的方式docker來安裝redis,首先我們來了解一下什么是redis以及我們?yōu)槭裁匆褂胷edis,以及它的優(yōu)缺點(diǎn),感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2021-05-05
  • 關(guān)于Redis緩存問題及解決

    關(guān)于Redis緩存問題及解決

    這篇文章主要介紹了關(guān)于Redis緩存問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Redis遠(yuǎn)程字典服務(wù)器?hash類型示例詳解

    Redis遠(yuǎn)程字典服務(wù)器?hash類型示例詳解

    這篇文章主要介紹了Redis遠(yuǎn)程字典服務(wù)器?hash類型示例詳解,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Redis MGET命令深度解析

    Redis MGET命令深度解析

    Redis的MGET命令是一種高效的批量讀取操作,可以顯著提高讀取性能,減少網(wǎng)絡(luò)往返的次數(shù),本文從MGET命令的機(jī)制實(shí)現(xiàn)、底層原理、應(yīng)用場景及性能優(yōu)化等多個(gè)維度,深入解析Redis中的MGET命令的工作方式,并對它與其他批量操作命令的對比進(jìn)行了詳細(xì)介紹
    2024-09-09
  • Redis緩存穿透出現(xiàn)原因及解決方案

    Redis緩存穿透出現(xiàn)原因及解決方案

    這篇文章主要介紹了Redis緩存穿透出現(xiàn)原因及解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Redis教程(九):主從復(fù)制配置實(shí)例

    Redis教程(九):主從復(fù)制配置實(shí)例

    這篇文章主要介紹了Redis教程(九):主從復(fù)制配置實(shí)例,本文講解了Redis的Replication、Replication的工作原理、如何配置Replication、應(yīng)用示例等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • redis配置文件redis.conf中文版(基于2.4)

    redis配置文件redis.conf中文版(基于2.4)

    這篇文章主要介紹了redis配置文件redis.conf中文版(基于2.4),對英文不好的朋友是非常好的參考,需要的朋友可以參考下
    2014-06-06
  • Redis中Scan命令的踩坑實(shí)錄

    Redis中Scan命令的踩坑實(shí)錄

    這篇文章主要給大家介紹了關(guān)于Redis中Scan命令踩坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評論

岑巩县| 宜川县| 姚安县| 刚察县| 玛纳斯县| 平谷区| 平陆县| 离岛区| 瑞丽市| 上饶市| 五寨县| 岱山县| 沙湾县| 伽师县| 项城市| 扶风县| 迁西县| 正镶白旗| 临江市| 樟树市| 广安市| 白朗县| 东城区| 巴彦淖尔市| 八宿县| 苍溪县| 永州市| 济宁市| 田林县| 芜湖县| 秦皇岛市| 大洼县| 龙州县| 溧水县| 偏关县| 忻城县| 乌拉特中旗| 沿河| 庐江县| 车致| 林州市|