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

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

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

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

 @Autowired
    RedisTemplate redisTemplate;
 
    /**
     * redis分布式鎖演示案例,此處使用redisTemplate
     * @param stockId  此處以扣減庫存為例子,stockId代表要扣減庫存的商品id,庫存數(shù)據(jù)是提前存在redis的,并和數(shù)據(jù)庫進行同步
     * @return
     */
    public AjaxResult redisLockDemo(String stockId){
        //鎖前綴
        final String stock_lock = "stock_lock:";
        // 生成一個隨機唯一的值用于辨別鎖的使用對象
        String clientId = UUID.randomUUID().toString();
        //此處使用set(k,v,time,unit)來獲取鎖,確保加鎖和設置超時時間是原子操作
        Boolean lock = redisTemplate.opsForValue().setIfAbsent(stock_lock + stockId, clientId, 10, TimeUnit.MILLISECONDS);
        if (!lock){
            //獲取鎖失敗
            return AjaxResult.error("服務器繁忙,請稍后再試!");
        }
        //獲取鎖成功
        //執(zhí)行扣減庫存
        try {
            int stock = (int) redisTemplate.opsForValue().get(stockId);
            if (stock > 0){
                int realStock = stock - 1;
                // 重新設置庫存數(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實現(xiàn)分布式鎖

    @Autowired
    Redisson redisson; 
/**
     * redis分布式鎖演示案例,redisson
     * @param stockId  此處以扣減庫存為例子,stockId代表要扣減庫存的商品id,庫存數(shù)據(jù)是提前存在redis的,并和數(shù)據(jù)庫進行同步
     * @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ù)據(jù)
                redisTemplate.opsForValue().set(stockId, realStock + "");
                // .............其他步驟
                log.info("庫存扣減成功{}", stockId);
            } else {
                return AjaxResult.error("商品已經(jīng)被搶光了!");
            }
        }finally {
            lock.unlock();
        }
        return AjaxResult.success("扣減庫存成功!");
    }

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

相關文章

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

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

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

    詳解Centos7下配置Redis并開機自啟動

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

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

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

    關于Redis緩存問題及解決

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

    Redis遠程字典服務器?hash類型示例詳解

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

    Redis MGET命令深度解析

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

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

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

    Redis教程(九):主從復制配置實例

    這篇文章主要介紹了Redis教程(九):主從復制配置實例,本文講解了Redis的Replication、Replication的工作原理、如何配置Replication、應用示例等內(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命令的踩坑實錄

    Redis中Scan命令的踩坑實錄

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

最新評論

临泽县| 大连市| 九寨沟县| 江城| 枣阳市| 新疆| 理塘县| 五寨县| 洞头县| 金寨县| 嵩明县| 南岸区| 绥化市| 新泰市| 康保县| 明光市| 即墨市| 鸡泽县| 醴陵市| 密云县| 贡觉县| 娱乐| 涟水县| 普兰县| 武功县| 同江市| 中西区| 武功县| 兴业县| 台北市| 曲阳县| 金湖县| 忻州市| 鄂伦春自治旗| 莒南县| 汽车| 中方县| 德惠市| 东兴市| 黑水县| 遂昌县|