分享redis基础知识(四)

56 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

image.png 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