首页 > 数据库 >redis使用setnx实现分布式锁

redis使用setnx实现分布式锁

时间:2023-02-07 21:23:41浏览次数:48  
标签:return log org redis springframework setnx import 分布式

 

package com.shanhe.service;

import com.shanhe.entity.CommodityDetails;
import com.shanhe.lock.impl.RedisLockImpl;
import com.shanhe.mapper.CommodityDetailsMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;


@Slf4j
@RestController
public class SeckillRedisService {
    @Autowired
    private CommodityDetailsMapper commodityDetailsMapper;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    private String redisLockKey = "Lock";

    //    /**
//     * redis实现分布式锁  idea调试 停止 属于正常停止 idea非调试的情况下 非正常停止
//     *
//     * @return
//     * @throws Exception
////     */
    @RequestMapping("/seckilRedisLock")
    public String seckilRedisLock(Long commodityId) throws Exception {
        try {
            // setnx
            Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent(redisLockKey, "1", 30L, TimeUnit.SECONDS);
            if (!lock) {
               log.info("<获取锁失败>");
                return "获取失败啦,请稍后重试!";

            }
         
            CommodityDetails commodityDetails = commodityDetailsMapper.getCommodityDetails(commodityId);
            Long stock = commodityDetails.getStock();
            if (stock > 0) {
              log.info("<开始执行扣库存..>");
                int result = commodityDetailsMapper.reduceInventory(1l);
                return result > 0 ? "扣库存成功" : "扣库存失败";
            }
            // 扣库存失败
            log.info("<扣库存失败>");

        } catch (Exception e) {
            log.error("<e:>", e);
        } finally {
            // 释放锁
            log.info("<释放锁>");
            stringRedisTemplate.delete(redisLockKey);
        }
        return "fail";
    }
}

 

标签:return,log,org,redis,springframework,setnx,import,分布式
From: https://www.cnblogs.com/shanheyongmu/p/17099833.html

相关文章

  • Redis在java中的使用
    1.添加价包<!--Redis依赖--><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>......
  • redis超卖(分布式锁) setnx排他独占 最终效果,既可以防止死锁,又可以设置过期时间
    热点key过期,加一个锁,抢占到锁才会去查询mysql数据库,然后查到数据后重新写入redis,几百台服务器,几十个热点数据,不能用jvm锁            ----......
  • Curator实现分布式锁代码
    Curator环境搭建Maven依赖<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.2.0</version></......
  • 一文搞懂Redis
    作者:京东物流刘丽侠姚再毅康睿刘斌李振一、Redis的特性1.1Redis为什么快?基于内存操作,操作不需要跟磁盘交互,单次执行很快命令执行是单线程,因为是基于内存操作,单次执行......
  • 单线程架构的Redis如此之快的 4 个原因
    前言作为内存中数据存储,Redis以其速度和性能着称,通常被用作大多数后端服务的缓存解决方案。但是,在内部,Redis采用单线程架构。为什么单线程设计依然会有这么高的性能?如......
  • redisson分布式锁的应用——秒杀、超卖 简单例子(分布式锁相关)
    1、常见的分布式事务锁1、数据库级别的锁乐观锁,给予加入版本号实现悲观锁,基于数据库的forupdate实现2、Redis,基于SETNX、EXPIRE实现3、Zookeeper,基于InterProcess......
  • Redis 压缩包单节点安装
    下载Redis稳定版本直接下载或者去官网自行下载​​Download|Redis​​wgethttps://download.redis.io/redis-stable.tar.gz编译Redistar-xzvfredis-stable.tar.gzcdre......
  • 复习redis持久化的两种方式RDB和AOF
    redis持久化----两种方式1、redis提供了两种持久化的方式,分别是RDB(RedisDataBase)和AOF(AppendOnlyFile)。2、RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并......
  • Redis的十六种应用场景
    Redis16个常见使用场景这个场景最开始是是一篇介绍微博Redis应用的PPT中看到的,其中提到微博的Redis主要是用在在计数和好友关系两方面上,当时对好友关系方面的用法不太了......
  • redis各种数据类型进行操作
    1.数据操作Dao /***RedisManager操作类*使用SpringDataRedis进行整合**@authoryy*@since1.0.0,2019年08月20日*/@ComponentpublicclassRedisM......