优化网站做什么的,企业网站开发的感想,手机微信网页版网址,wordpress无法启动1.Redis的事务是什么
Redis 事务的本质是一组命令的集合,事务支持一次执行多个命令#xff0c;一个事务中所有命令都会被序列化。(redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令).
1.1reids事务的特点 事务同命令一样都是Redis最小的执行单位#xff0…1.Redis的事务是什么
Redis 事务的本质是一组命令的集合,事务支持一次执行多个命令一个事务中所有命令都会被序列化。(redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令).
1.1reids事务的特点 事务同命令一样都是Redis最小的执行单位一个事务中的命令要么都执行要么都不执行 在事务执行过程会按照顺序串行化执行队列中的命令其他客户端提交的命令请求不会插入到事务执行命令序列中 Redis的事务还能保证一个事务内的命令依次执行而不被其他命令插入
1.2.Redis的常用操作
MULTI, EXEC, DISCARD and WATCH 是Redis事务的基础。用来显式开启并控制一个事务它们允许在一个步骤中执行一组命令。并提供两个重要的保证 事务中的所有命令都会被序列化并按顺序执行。在执行Redis事务的过程中不会出现由另一个客户端发出的请求。这保证 命令队列 作为一个单独的原子操作被执行。 队列中的命令要么全部被处理要么全部被忽略。EXEC命令触发事务中所有命令的执行因此当客户端在事务上下文中失去与服务器的连接.
1.2.1MULTI 命令
用于标记事务块的开始。Redis会将后续的命令逐个放入队列中然后才能使用EXEC命令原子化地执行这个命令序列。 这个命令的运行格式如下所示MULTI
这个命令的返回值是一个简单的字符串总是OK。
1.2.2. EXEC命令
在一个事务中执行所有先前放入队列的命令然后恢复正常的连接状态。当使用WATCH命令时只有当受监控的键没有被修改时EXEC命令才会执行事务中的命令这种方式利用了检查再设置CAS的机制()。这个命令的运行格式如下所示EXEC
这个命令的返回值是一个数组其中的每个元素分别是原子化事务中的每个命令的返回值。当使用WATCH命令时如果事务执行中止那么EXEC命令就会返回一个Null值。(如果在发送EXEC命令前客户端断线了则Redis会清空事务队列事务中的所有命令都不会执行。而一旦客户端发送了EXEC命令所有的命令就都会被执行)
1.2.3. DISCARD命令
清除所有先前在一个事务中放入队列的命令然后恢复正常的连接状态。如果使用了WATCH命令那么DISCARD命令就会将当前连接监控的所有键取消监控。这个命令的运行格式如下所示DISCARD
这个命令的返回值是一个简单的字符串总是OK。
1.2.4. WATCH命令
当某个事务需要按条件执行时就要使用这个命令将给定的键设置为受监控的.
1.Watch指令类似乐观锁事务提交时如果Key的值已被别的客户端改变比如某个list已被别的客户端push/pop过了整个事务队列都不会被执行
2.通过WATCH命令在事务执行之前监控了多个Keys倘若在WATCH之后有任何Key的值发生了变化EXEC命令执行的事务都将被放弃同时返回Nullmulti-bulk应答以通知调用者事务执行失败。 这个命令的运行格式如下所示WATCH key [key …]
这个命令的返回值是一个简单的字符串总是OK。对于每个键来说时间复杂度总是O(1)。
1.2.5. UNWATCH命令
清除所有先前为一个事务监控的键。如果你调用了EXEC或DISCARD命令那么就不需要手动调用UNWATCH命令。这个命令的运行格式如下所示UNWATCH
这个命令的返回值是一个简单的字符串总是OK。时间复杂度总是O(1)。
2.Redis 事务的三个阶段
Redis 中的事务从开始到结束也是要经历三个阶段开启事务,命令入列,执行事务/放弃事务
2.1开启事务阶段
1.multi 命令用于开启事务
2.multi 命令可以让客户端从非事务模式状态变为事务模式状态如下图所示
3.注意multi 命令不能嵌套使用如果已经开启了事务的情况下再执行 multi 命令会提示如下错误
错误:(error) ERR MULTI calls can not be nested执行效果如下代码所示127.0.0.1:6379 multi
OK
127.0.0.1:6379 multi
(error) ERR MULTI calls can not be nested4.当客户端是非事务状态时使用 multi 命令客户端会返回结果 OK 如果客户端已经是事务状态再执行 multi 命令会 报不能嵌套的错误但不会终止客户端为事务的状态 如下图所示 2.2命令入列阶段
1.客户端进入事务状态之后,将多个命令入队到事务中接到这些命令并不会立即执行,而是放到等待执行的事务队列里面, 命令入列成功后会返回 QUEUED,如下代码所示: multi
OKset k v
QUEUEDget k
QUEUED2.命令会按照先进先出FIFO的顺序出入列也就是说事务会按照命令的入列顺序从前往后依次执行。
执行流程如下图所示 2.3执行事务/放弃事务阶段
执行事务的命令是 exec 放弃事务的命令是 discard
执行事务示例代码如下 multi
OKset k v2
QUEUEDexec
1) OKget k
v2放弃事务示例代码如下 multi
OKset k v3
QUEUEDdiscard
OKget k
v23.事务错误回滚
事务执行中的错误分为以下三类
1.执行时才会出现的错误(简称执行时错误)
2.入列时错误不会终止整个事务
3.入列时错误会终止整个事务。
3.1执行时错误
从以下实例结果可以看出即使事务队列中某个命令在执行期间发生了错误事务也会继续执行直到事务队列中所有命令执行完成。 3.2入列时,错误不会导致事务结束
从以下实例结果可以看出重复执行 multi 会导致入列错误但不会终止事务最终查询的结果是事务执行成功了。除了重复执行 multi 命令还有在事务状态下执行 watch 也是同样的效果 3.3入列错误会导致事务结束 3.4为什么不支持事务回滚
不支持事务回滚的原因有以下两个
1.Redis事务的执行时错误通常都是编程错误造成的这种错误通常只会出现在开发环境中而很少会在实际的生产环境中出现所以他认为没有必要为 Redis 开发事务回滚功能
2.不支持事务回滚是因为这种复杂的功能和 Redis 追求的简单高效的设计主旨不符合。
4.Redis事务的三个特性
1.单独的隔离操作事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中不会被其他客户端发送来的命令请求所打断。
2.没有隔离级别的概念队列中的命令没有提交之前都不会实际的被执行因为事务提交前任何指令都不会被实际执行也就不存在”事务内的查询要看到事务里的更新在事务外查询不能看到”这个
3.不保证原子性redis同一个事务中如果有一条命令执行失败其后的命令仍然会被执行没有回滚
5.悲观锁与乐观锁
1.悲观锁(Pessimistic Lock), 顾名思义就是很悲观每次去拿数据的时候都认为别人会修改所以每次在拿数据的时候都会上锁这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制比如行锁表锁等读锁写锁等都是在做操作之前先上锁
2.乐观锁(Optimistic Lock), 顾名思义就是很乐观每次去拿数据的时候都认为别人不会修改所以不会上锁但是在更新的时候会判断一下在此期间别人有没有去更新这个数据可以使用版本号等机制。乐观锁适用于多读的应用类型这样可以提高吞吐量;乐观锁策略:提交版本必须大于记录当前版本才能执行更新