基于redis实现互斥锁

利用setnx命令实现类似获取锁和释放锁。

获取锁,setnx lock 1,返回值为1视为获取成功,为0视为获取失败

释放锁,del lock

特殊情况:

如果获取锁之后,锁来还来不及释放,redis宕机了,这样其他线程永远无法获取锁的情况,这样就会造成死锁问题。应对这种情况,我们可以让这个锁自动过期(这里设置锁的过期时间为10s).

图1还有弊端,可能刚创建完锁还没来得及设置时间时,就宕机了

图2推荐

实现:

java 复制代码
public class SimpleRedisLock implements ILock{
    private StringRedisTemplate stringRedisTemplate;
    //使用这个锁工具的业务名称
    private String name;

    public SimpleRedisLock(StringRedisTemplate stringRedisTemplate, String name) {
        this.stringRedisTemplate = stringRedisTemplate;
        this.name = name;
    }

    //前缀
    private static final String KEY_PREFIX = "lock:";

    @Override
    public boolean tryLock(Long timelockSec) {
        long threadid = Thread.currentThread().getId();
        Boolean success = stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX + name, threadid + "", timelockSec, TimeUnit.SECONDS);
        return Boolean.TRUE.equals(success);
    }

    @Override
    public void unlock() {
    stringRedisTemplate.delete(KEY_PREFIX + name);
    }
}
相关推荐
今天AI了吗1 天前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
阿里巴巴P8资深技术专家1 天前
Redis连接工具 —— Redis Manager
redis
CDN3601 天前
CDN 缓存策略优化实操:出海业务提升缓存命中率,TTL、缓存 Key、刷新配置与踩坑总结
缓存·cdn加速·cdn防护·360cdn
lilian2331 天前
Harmony os 技术实战|拼豆制图27:用单字符编码承载 50 张 70×70 图纸
前端·数据库·华为·harmonyos
皮卡丘不断更1 天前
手机优先的 Personal Ledger:把账目、学习和复盘放到同一个入口
数据库·sqlite·fastapi·开源项目·个人效率
保卫大狮兄1 天前
设备管理从台账到报废,完整生命周期一次讲清
数据库·设备管理·设备
数据安全技术观察1 天前
数据动态脱敏:让脱敏策略跟着数据目录走
大数据·网络·数据库
小席是个热心肠1 天前
Redis的自我学习
数据库·redis·学习
2601_965798471 天前
Salient Theme Setup Guide for Fast Creative WordPress Sites
数据库·web3·php·wordpress
@Mike@1 天前
09-数据库学习笔记(数据库索引与过滤器)
数据库·笔记