1. Redis事务
在数据库相关理论中,一个逻辑工作单元想要成为事务,就必须满足ACID,即原子性、一致性、隔离性和持久性。
- 原子性:原子性这个概念其实就是指,一个事务内的所有SQL操作都是一个整体,因此只有所有的SQL操作都完全执行成功,该事务方可以认为提交成功。如果在提交事务过程中某一条SQL语句执行失败,则整个事务必须回滚到事务提交前的状态。
- 一致性:而一致性这个概念则是指,事务在完成的时候,必须要保证所有的数据都保持一致的状态,而落实到数据库的各个组成部分上,则要求开发人员能够保证数据、索引、约束、日志等在事务前后具备一致性。
- 隔离性:隔离性这个概念主要针对并发,其核心思想就是不同的并发事务对数据产生的修改必须是相互隔离的,假设有两个不同的事务A和B并发执行,那么对A来讲,它在执行前的状态只有两种,即B执行前和B执行后。同理,对B来讲同样是如此,这样的特性我们就称为隔离性。
- 持久性:持久性相对简单,是指事务完成以后它对数据的影响是永久性的。
redis事务依赖于它是单线程的,提供了一种“将多个命令打包, 然后一次性、按顺序地执行”的机制, 并且事务在执行的期间不会主动中断 —— 服务器在执行完事务中的所有命令之后, 才会继续处理其他客户端的其他命令。
Redis中的事务是可以视为一个队列,即我们可以通过MULTI开始一个事务,这相当于我们声明了一个命令队列。接下来,我们向Redis中提交的每条命令,都会被排入这个命令队列。当我们输入EXEC命令时,将触发当前事务,这相当于我们从命令队列中取出命令并执行,所以Redis中一个事务从开始到执行会经历 开始事务 、 命令入队 和 执行事务 三个阶段。
127.0.0.1:6383> multi
OK
127.0.0.1:6383> set name xiaoming
QUEUED
127.0.0.1:6383> set age 20
QUEUED
127.0.0.1:6383> set phone 188888888
QUEUED
127.0.0.1:6383> exec
1) OK
2) OK
3) OK
127.0.0.1:6383>
Redis官方是没有提供回滚方法, 值提供了取消事务。discard
取消提交事务.
127.0.0.1:6383> multi
OK
127.0.0.1:6383> set test1 123
QUEUED
127.0.0.1:6383> set test2 456
QUEUED
127.0.0.1:6383> DISCARD
OK
127.0.0.1:6383>
还有watch
、unwatch
命令,也是事务中华用到的,可以自己查一下用法。
2. Redis实现分布式锁
- Redis实现分布式锁基于SetNx命令,因为在Redis中key是保证是唯一的。所以当多个线程同时的创建setNx时,只要谁能够创建成功谁就能够获取到锁。
- SetNx命令 每次SetNx检查该 key是否已经存在,如果已经存在的话不会执行任何操作,返回为0; 如果不存在的话直接新增该key,返回1。
- 获取锁的时候:当多个线程同时创建SetNx k时,只要谁能够创建成功谁就能够获取到锁。
释放锁:可以手动删除,也可以对该key设置一个有效期可以避免死锁的现象。
网友评论