Redis分布式锁释放锁是否必须用lua脚本?

无lua脚本释放锁:

java 复制代码
public void unlock(String key, String uniqueValue) {
	String value =redisDao.getString(key);
	if (value != null && value.equals(uniqueValue))
		redisDao.delete(key);
}

使用lua脚本释放锁:

java 复制代码
	// LUA脚本 -> 分布式锁解锁原子操作脚本
    private static final String LUA_SCRIPT =
            "if redis.call('get',KEYS[1]) == ARGV[1] then" +
                    " return redis.call('del',KEYS[1]) " +
                    "else" +
                    " return 0 " +
                    "end";
    // lockId 一个不重复id -> 区分不同客户端
    public boolean unlock(String lockId) {
        Jedis client = jedisPool.getResource();
        try {
            Object result = client.eval(LUA_SCRIPT, Arrays.asList(LOCK_KEY), Arrays.asList(lockId));
            if (result != null && "1".equalsIgnoreCase(result.toString())) {
                return ture;
            }
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            log.error(e.getMessage());
        }
        return false;
    }

在释放锁的时候,如果没用原子操作,那么取值、比较、删除是三步操作。

假设现在是线程A在执行当前的动作。如果线程A取值之后,删除操作之前,key正好过期了,那么锁就自动释放了。这时,又被另外一个线程B获取了锁,那么在删除操作时,就会把线程B的锁给删除掉。如果这时线程B还在执行中,因为线程B的锁被线程A给删除掉了,那么其他的线程C也就可以获取到锁了。这样,其实临界区就有多个线程在运行了。

相关推荐
叶总没有会1 小时前
RabbitMQ高级
分布式·rabbitmq
用户094248568033 小时前
第3章:Redis字符串 String 实战:验证码、计数器与分布式开关
redis·源码
VX_bysjlw9853 小时前
基于协同过滤的美食推荐系统的设计与实现32221-计算机毕设原创(免费领源码+带部署教程)
java·spring boot·redis·mysql·tomcat·maven·mybatis
ABB自动化5 小时前
ABB 500CIM06 (1MRB150077R0111) | REB500 通信接口
大数据·分布式·系统架构·系统安全·模块测试·plc 控制器
ZENERGY-众壹5 小时前
告别本地工控机:分布式光伏 SCADA 架构如何实现云边协同
分布式·架构·光伏运维·能源数字化·电站监控
code_slave(码畜)5 小时前
微服务架构落地:读写分离架构 —— 主从延迟引发的“刚开单查不到”灾难与破局
spring boot·分布式·spring cloud·微服务·云原生·架构·读写分离
hweiyu005 小时前
Redis命令:RPUSHX
redis·缓存
JAVA_AI人工智能项目实战7 小时前
分布式大模型训练_学习笔记
人工智能·分布式·语言模型·自然语言处理
星夜孤帆7 小时前
Redis缓存击穿与分布式锁实战:专栏目录、源码与实验说明
redis·分布式·缓存