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

相关推荐
慧一居士5 分钟前
xxl-job服务搭建,以及 springboot 集成xxl-job 项目完整步骤示例
分布式·中间件
困知勉行198518 分钟前
springboot整合redis
java·spring boot·redis
飞鸟真人1 小时前
Redis面试常见问题详解
数据库·redis·面试
ANnianStriver4 小时前
redis安装包方式下载安装
数据库·redis·缓存
姓蔡小朋友4 小时前
LUA脚本
开发语言·junit·lua
oMcLin5 小时前
如何在 Ubuntu 22.04 服务器上实现分布式数据库 Cassandra 集群,优化数据一致性与写入吞吐量
服务器·分布式·ubuntu
山沐与山5 小时前
【Redis】读写锁实战详解:读多写少场景的性能优化利器
数据库·redis·性能优化
金融新世界7 小时前
推动产业升级:倒逼转型创新与重构产业链格局
lua
马达加斯加D8 小时前
系统设计 --- 使用消息队列解决分布式事务
分布式
oMcLin9 小时前
如何在 Debian 11 上配置并优化 Nginx 与 Lua 脚本,提升高并发网站的动态请求处理能力?
nginx·debian·lua