基于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);
    }
}
相关推荐
闻哥2 分钟前
Redis事务详解
java·数据库·spring boot·redis·缓存·面试
道亦无名31 分钟前
aiPbMgrSendAck
java·网络·数据库
面向对象World3 小时前
正点原子Mini Linux 4.3寸800x480触摸屏gt115x驱动
linux·服务器·数据库
dinga198510264 小时前
mysql之联合索引
数据库·mysql
微风中的麦穗4 小时前
【SQL Server 2019】企业级数据库系统—数据库SQL Server 2019保姆级详细图文下载安装完全指南
大数据·数据库·sqlserver·云计算·个人开发·运维必备·sqlserver2019
zjttsh5 小时前
MySQL加减间隔时间函数DATE_ADD和DATE_SUB的详解
android·数据库·mysql
顾北125 小时前
SpringCloud 系列 04:Gateway 断言 / 过滤器 / 限流 一站式落地指南
java·开发语言·数据库
禹凕5 小时前
MYSQL——基础知识(NULL 值处理)
数据库·mysql
码云数智-大飞5 小时前
SQL Server 无法启动?常见原因及详细解决方法指南
数据库
8486981195 小时前
MySQL 只读库踩坑实录:为什么 INSERT/UPDATE 不报错,DELETE 却直接炸了?
数据库·mysql·hibernate