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也就可以获取到锁了。这样,其实临界区就有多个线程在运行了。

相关推荐
笨蛋不要掉眼泪2 分钟前
Spring Cloud Gateway 扩展:全局跨域配置
java·分布式·微服务·架构·gateway
難釋懷9 分钟前
Redis消息队列-基于Stream的消息队列
数据库·redis·缓存
java1234_小锋10 分钟前
Java高频面试题:说说Redis的内存淘汰策略?
java·开发语言·redis
正在走向自律40 分钟前
高并发场景下一卡通系统数据库架构设计与实践
数据库·分布式·一卡通系统
予枫的编程笔记1 小时前
【Kafka进阶篇】Canal+Kafka+ES实战:内容平台数据同步难题,这样解最优雅
redis·mysql·elasticsearch·kafka·canal·数据同步·异步解耦
LSL666_1 小时前
5 Redis通用命令
java·开发语言·redis·命令
rannn_1111 小时前
【Redis|基础篇】初识、Redis的安装与启动、Redis命令、Java客户端
java·redis·后端·缓存·nosql
西***63471 小时前
多领域落地验证:分布式 KVM 如何成为指挥中心的 “协同核心引擎”
分布式
安科瑞解决方案一站通1 小时前
分布式光储监控系统的四个实战样本:从分散走向聚合的技术路径
分布式·微电网·电力·配电·零碳园区·用电安全
知识即是力量ol1 小时前
深入理解 Snowflake 雪花算法:原理、本质、趋势递增问题与分布式顺序困境全解析
java·分布式·算法·雪花算法·snowflake·全局唯一id·分布式id生成器