站长素材网app免费下载,网站app的区别是什么,购物网站的建立,微信文章wordpress1.事务Redis介绍 事务表示一组动作#xff0c;要么全部执行#xff0c;要么全部不执行。 例如微博粉丝关注用户#xff0c;博主粉丝列表增加了用户#xff0c;粉丝关注列表增加了博主#xff1b; Redis 提供了简单的事务功能#xff0c;将一组需要一起执行的命令放到mult…1.事务Redis介绍 事务表示一组动作要么全部执行要么全部不执行。 例如微博粉丝关注用户博主粉丝列表增加了用户粉丝关注列表增加了博主 Redis 提供了简单的事务功能将一组需要一起执行的命令放到multi和exec两个命令之间。multi([mʌlti]) 命令代表事务开始exec(美[ɪɡˈzek])命令代表事务结束如果要停止事务的执行可以使用discard命令代替exec命令即可。
它们之间的命令是原子顺序执行的,例如下面操作实现了上述用户关注问题。 可以看到sadd命令此时的返回结果是QUEUED代表命令并没有真正执行而是暂时保存在Redis中的一个缓存队列所以discard也只是丢弃这个缓存队列中的未执行命令并不会回滚已经操作过的数据这一点要和关系型数据库的Rollback 操作区分开。如果此时另一个客户端执行sismember u:a:follow ub返回结果应该为0。 只有当exec执行后用户A关注用户B的行为才算完成如下所示exec返回的两个结果对应sadd命令。 另一个客户端 如果事务中的命令出现错误,Redis 的处理机制也不尽相同。
1、命令错误例如下面操作错将set写成了sett属于语法错误会造成整个事务无法执行key和counter 的值未发生变化: 2.运行时错误例如用户B在添加粉丝列表时
误把sadd命令(针对集合)写成了zadd命令(针对有序集合)这种就是运行时命令因为语法是正确的:
可以看到Redis并不支持回滚功能sadd u:c:follow ub命令已经执行成功,开发人员需要自己修复这类问题。有些应用场景需要在事务之前确保事务中的key没有被其他客户端修改过才执行事务否则不执行(类似乐观锁)。Redis 提供了watch命令来解决这类问题。
客户端1 客户端2 客户端1继续 可以看到“客户端-1”在执行multi之前执行了watch命令“客户端-2”在“客户端-1”执行exec之前修改了key值造成客户端-1事务没有执行(exec结果为nil)。
Redis 客户端中的事务使用代码参见cn.tuling.redis.adv.RedisTransaction
2.Pipeline 和事务的区别
简单来说
1、pipeline 是客户端的行为对于服务器来说是透明的可以认为服务器无法区分客户端发送来的查询命令是以普通命令的形式还是以pipeline的形式发送到服务器的
2 而事务则是实现在服务器端的行为用户执行MULTI命令时服务器会将对应这个用户的客户端对象设置为一个特殊的状态在这个状态下后续用户执行的查询命令不会被真的执行而是被服务器缓存起来直到用户执行EXEC命令为止服务器会将这个用户对应的客户端对象中缓存的命令按照提交的顺序依次执行。
3、应用pipeline 可以提服务器的吞吐能力并提高Redis处理查询请求的能力。但是这里存在一个问题当通过pipeline提交的查询命令数据较少可以被内核缓冲区所容纳时Redis可以保证这些命令执行的原子性。然而一旦数据量过大超过了内核缓冲区的接收大小那么命令的执行将会被打断原子性也就无法得到保证。因此pipeline只是一种提升服务器吞吐能力的机制如果想要命令以事务的方式原子性的被执行还是需要事务机制或者使用更高级的脚本功能以及模块功能。
4、可以将事务和pipeline结合起来使用减少事务的命令在网络上的传输时间将多次网络IO缩减为一次网络IO。Redis 提供了简单的事务之所以说它简单主要是因为它不支持事务中的回滚特性,同时无法实现命令之间的逻辑关系计算当然也体现了Redis 的“keep it simple”的特性。