持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
reids事务策略(redis事务没有回滚)
Multi 开启事务
EXEC 提交事务
Watch 可以监听一个或者多个key,在提交事务之前是否有发生了变化 如果发生边了变化就不会提交事务,没有发生变化才可以提交事务 版本号码 乐观锁
watch name
multi
set name xiaoxiao
exec
Discard 取消提交事务
注意:Redis官方是没有提供回滚方法, 值提供了取消事务。
思考:Redis与Mysql中的事务有那些区别?
redis没有隔离性,开启事务后,会把数据放到队列中,最后EXEC才能保存到reids中。
reids没有行锁(隔离性),两台线程同时开启事务,对reids进行修改,都会修改成功,看谁最后提交事务。
mysql的行锁,对一行数据进行操作,另外的客户端不会对这个行数据修改的。 redis分布式锁
应用场景:定时任务,防止重复执行,保证只有一个JVM执行。
核心思路:
1、获取锁
多个不同的jvm同时创建一个相同的标记(全局唯一的),只要谁能够创建成功谁就能获取。
2、释放锁
释放全局位置标记,其他jvm重新进入获取锁资源。
3、超时锁(没有获取到锁、已经获取到锁)
没有获取到锁:不断重试获取锁,等待获取锁的超时时间
已经获取到锁:一直不释放,对锁设置有效期,防止死锁。
Redis实现分布式锁基于SetNx命令,因为在Redis中key是保证是唯一的。所以当多个线程同时的创建setNx时,只要谁能够创建成功谁就能够获取到锁。
Set 命令 每次set时,可以修改原来旧值;
SetNx命令 每次SetNx检查该 key是否已经存在,如果已经存在的话不会执行任何操作。返回为0 如果已经不存在的话直接新增该key。
1:新增key成功 0 失败
获取锁的时候:当多个线程同时创建SetNx k,只要谁能够创建成功谁就能够获取到锁。
释放锁:可以对该key设置一个有效期可以避免死锁的现象。
分析基于Zk实现分布式锁思路
1.获取锁
多个不同的jvm在zk集群上创建一个相同的全局唯一的临时路径,只要谁能够创建成功谁就能够获取到锁。
分析:临时节点对我们节点设置有效期
2.释放锁
人为主动删除该节点或者使用Session有效期
3.超时锁(没有获取锁、已经获取锁)
等待获取锁的超时时间(使用Session有效期效率比reids低)
已经获取到锁 锁的有效期 5s
Redis也类似于zk事件通知
Redis官网是有了一个redis解决分布锁框架redission