说一说工作中用到的简单的redis分布式锁

本文介绍了一种使用Redis实现的分布式锁机制,通过设置键值和过期时间来防止并发冲突,确保了分布式环境下资源操作的一致性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis分布式锁

    package com.nio.otd.lop.inventory.util;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisCallback;
    import org.springframework.data.redis.core.StringRedisTemplate;
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * @Auther: turbo.cai
     * @Date: 2019/7/25 14:42
     * @Description:
     */
    @Slf4j
    public class MyRedisUtils {
        @Autowired
        StringRedisTemplate stringRedisTemplate;
    
        /**
         *
         * @param lockKey
         * @param lockTime 过期时间
         * @return
         */
        public long lock(String lockKey, Long lockTime) {
            Long lockValue = System.currentTimeMillis() + lockTime;
            //定义一个时间,在指定时间内可重试获取锁
            Long waitTime = System.currentTimeMillis() + 1000L;
            Boolean flag = stringRedisTemplate.execute((RedisCallback<Boolean>) e -> {
                Boolean success = false;
                try {
                    do {
                        success = e.setNX(lockKey.getBytes(), lockValue.toString().getBytes());
                        if (success) {
                            return success;
                        }
                        Thread.sleep(200);//第一次获取失败,隔200毫秒重试
                    } while (System.currentTimeMillis() < waitTime);//即在1000毫秒内获取锁失败还可以不断重试获取锁
                } catch (Throwable ex) {
                    ex.printStackTrace();
                }
                return success;
            });
            if (flag) {
                //加锁成功,设置过期时间
                stringRedisTemplate.expire(lockKey, lockTime, TimeUnit.MILLISECONDS);
                return lockValue;
            }
            return -1;
        }
    
        public void unlock(String lockKey,long lockValue){
            //根据key获取redis存入的value
            String result = stringRedisTemplate.opsForValue().get(lockKey);
            Long oldValue = result == null?null:Long.valueOf(result);
            if (oldValue != null && oldValue == lockValue){
                stringRedisTemplate.delete(lockKey);
            }else {
                log.info("非加锁者,等待过期时间结束后释放锁");
            }
        }
    }
    


 

内容概要:本文档主要展示了C语言中关于字符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)字符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定字符串中分离出奇偶位置字符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维字符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解字符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对字符串并去除其中的空白字符;②学会编能够正确处理奇偶索引字符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维字符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值