基于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);
    }
}
相关推荐
繁华如雪亦如歌13 分钟前
Linux:Cache
缓存
黄焖鸡能干四碗34 分钟前
业务数据中台技术方案(PPT)
大数据·数据库·人工智能·安全·需求分析
阿杰真不会敲代码1 小时前
缓存一致性,缓存穿透,缓存雪崩,缓存击穿
缓存
apollowing1 小时前
PostgreSQL的备份方式
数据库·postgresql
数据知道1 小时前
MongoDB容量规划与资源预测:如何预估未来增长需求?
数据库·mongodb
行者-全栈开发2 小时前
信创时代:国产数据库崛起与技术选型指南
数据库·国产化·国产数据库·技术选型·信创时代
程序员鱼皮2 小时前
【后端必看】什么是 Elasticsearch?都要学什么?
java·数据库·程序员·编程·后端开发
Full Stack Developme2 小时前
Java 反射原理及应用
java·开发语言·数据库
莎士比亚的文学花园2 小时前
数据库——SQLite使用教程
数据库