ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

基于Redis setNX命令实现分布式加解锁

2021-10-11 22:57:57  阅读:213  来源: 互联网

标签:return String 解锁 Redis value Boolean result setNX redisTemplate


1、setNX命令说明:
SET resource_name my_random_value NX PX 30000
2、代码演示:
@Service
public class BaseSetNXDistributeLockService {

    private static final Logger LOGGER = LoggerFactory.getLogger(BaseSetNXDistributeLockService.class);

    @Autowired
    private RedisTemplate redisTemplate;

    public String redisLock() {
        LOGGER.info("我进入了方法!");
        String key = "redisKey";
        String value = UUID.randomUUID().toString();

        RedisCallback<Boolean> redisCallback = connection -> {
            //设置NX
            RedisStringCommands.SetOption setOption = RedisStringCommands.SetOption.ifAbsent();
            //设置过期时间
            Expiration expiration = Expiration.seconds(30);
            //序列化key
            byte[] redisKey = redisTemplate.getKeySerializer().serialize(key);
            //序列化value
            byte[] redisValue = redisTemplate.getValueSerializer().serialize(value);
            //执行setnx操作
            Boolean result = connection.set(redisKey, redisValue, expiration, setOption);
            return result;
        };
        //获取分布式锁
        Boolean lock = (Boolean) redisTemplate.execute(redisCallback);
        if (lock) {
            LOGGER.info("我进入了锁!");
            try {
                Thread.sleep(15000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then\n"+
                        "  return redis.call(\"del\",KEYS[1])\n"+
                        "else\n"+
                        "  return 0\n"+
                        "end";
                RedisScript<Boolean> redisScript = RedisScript.of(script, Boolean.class);
                List<String> keys = Arrays.asList(key);
                Boolean result = (Boolean) redisTemplate.execute(redisScript,keys,value);
                LOGGER.info("释放锁的结果:"+result);

                
            }
        }
        return "方法执行完成!";
    }

}

标签:return,String,解锁,Redis,value,Boolean,result,setNX,redisTemplate
来源: https://blog.csdn.net/weixin_40857858/article/details/120713706

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有