基于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);
    }
}
相关推荐
qq_356408661 小时前
canal同步mysql到mysql主要配置
数据库·mysql
钢铁男儿2 小时前
C#方法返回值全解析:从基础语法到实战技巧
服务器·数据库·c#
AquaPluto3 小时前
Django ORM详解
数据库·django
陆少枫7 小时前
MySQL基础关键_007_DQL 练习
数据库·mysql
m0_616188499 小时前
vue3 - keepAlive缓存组件
前端·vue.js·缓存
千月落9 小时前
ClickHouse副本集群
服务器·数据库·clickhouse
jjkkzzzz9 小时前
Mysql常用语句汇总
数据库·mysql
找不到、了9 小时前
聊聊对Mysql的理解
数据库·mysql
kngines10 小时前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.2 数据类型转换(CAST函数/自定义函数)
数据库·postgresql·数据分析·filter·自定义函数·cte
半桶水专家11 小时前
使用frpc链接内网的mysql
数据库·mysql·adb