Redis锁实现并发高效的安全释放(redis 锁的释放)
当多个客户端同时访问一个资源时,Flink做操作要保证atomic性、防止脏写(dirty write)和不可重复读(non-repeatable read)事务这2个约束,为了实现这2个atomicity约束,用到了Redis锁,以防止并发发生竞争操作。
Redis锁是一种对单个系统实例可用的用于控制共享资源访问和安全释放的功能。它可以用来防止并发请求同时修改同一个资源,并且比一般锁机制更安全。
实现Redis锁的方法:
(1)客户端A在Redis中设置一个资源锁,也就是创建一个带有过期时间的key
'Sadd resources:lock resource_name'
'Expire resources:lock resource_name 3600'
(2)客户端B再次访问时,尝试在 Redis 中设置资源锁,如果
key 已存在,则无法设置,客户端 B 就会判断为令牌被占用,并等待 A 释放令牌。
'Sadd resources:lock resource_name'
(3)当客户端 A 操作完毕之后,释放占用的资源锁
'Del resources:lock resource_name'
优点:Redis锁能够有效实现并发请求的安全释放,因为它使用“保护共享资源”,可以保证每个客户端只能访问其所有的操作。另外Redis在保存数据和操作数据方面更为高效,也更加安全。
缺点:Redis的缺点也是一个值得考虑的方面,尤其是对于某些性能敏感的场景。因为Redis在处理高并发任务时,执行同步操作会比较缓慢,可能会影响整个系统的性能。
综上所述,Redis作为一种锁机制可以有效防止并发冲突,保障资源的原子性。它的优点是可以有效优化性能,但也可能会在高并发时拖慢整体性能,因此,在使用Redis锁时需要认真考虑。