redis事务处理机制,但当涉猎
发布日期:2021-06-30 19:46:16 浏览次数:2 分类:技术文章

本文共 1493 字,大约阅读时间需要 4 分钟。

在这里插入图片描述

文章目录

前言

来我们看看redis事务处理机制的使用,看看和MySQL事务有什么不一样。

大家都说,了解一下就好,意义并不大。

不过在大神的博客里看到他提了一下,那我就学一下。

redis事务相关命令

MULTI 命令用于开启一个事务,它总是返回 OK 。 MULTI 执行之后, 客户端可以继续向服务器发送任意多条命令, 这些命令不会立即被执行, 而是被放到一个队列中, 当 EXEC命令被调用时, 所有队列中的命令才会被执行。

通过调用 DISCARD , 客户端可以清空事务队列, 并放弃执行事务。

EXEC 命令负责触发并执行事务中的所有命令。如果客户端在使用 MULTI 开启了一个事务之后,却因为断线而没有成功执行 EXEC ,那么事务中的所有命令都不会被执行。

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

当使用 AOF 方式做持久化的时候, Redis 会使用单个 write(2) 命令将事务写入到磁盘中。

然而,如果 Redis 服务器因为某些原因被管理员杀死,或者遇上某种硬件故障,那么可能只有部分事务命令会被成功写入到磁盘中。

如果 Redis 在重新启动时发现 AOF 文件出了这样的问题,那么它会退出,并汇报一个错误。

使用redis-check-aof程序可以修复这一问题:它会移除 AOF 文件中不完整事务的信息,确保服务器可以顺利启动。

事务出故障

使用事务时可能会遇上以下两种错误:

1)事务在执行 EXEC 之前,入队的命令可能会出错。比如说,命令可能会产生语法错误(参数数量错误,参数名错误,等等),或者其他更严重的错误,比如内存不足(如果服务器使用 maxmemory 设置了最大内存限制的话)。

对于发生在 EXEC 执行之前的错误,客户端以前的做法是检查命令入队所得的返回值:如果命令入队时返回 QUEUED ,那么入队成功;否则,就是入队失败。如果有命令在入队时失败,那么大部分客户端都会停止并取消这个事务。

在这里插入图片描述

2)命令可能在 EXEC 调用之后失败。举个例子,事务中的命令可能处理了错误类型的键,比如将列表命令用在了字符串键上面,诸如此类。

那些在 EXEC 命令执行之后所产生的错误, 并没有对它们进行特别处理: 即使事务中有某个/某些命令在执行时产生了错误, 事务中的其他命令仍然会继续执行。

在这里插入图片描述

为什么 Redis 不支持回滚

因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

在通常情况下, 回滚并不能解决编程错误带来的问题。

简单的说,没必要,错肯定是人的错,人负责。

乐观锁与悲观锁

WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。

被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。

在这里插入图片描述

WATCH 命令可以被调用多次。 对键的监视从 WATCH 执行之后开始生效, 直到调用 EXEC 为止。

用户还可以在单个 WATCH 命令中监视任意多个键。

使用无参数的 UNWATCH 命令可以手动取消对所有键的监视。

在这里插入图片描述

redis脚本和事务

从定义上来说, Redis 中的脚本本身就是一种事务, 所以任何在事务里可以完成的事, 在脚本里面也能完成。 并且一般来说, 使用脚本要来得更简单,并且速度更快。

不过事务来的比较早, 所以 Redis 才会同时存在两种处理事务的方法。

在不远的将来, 可能所有用户都会只使用脚本来实现事务也说不定。所以我说,事务,了解就好。

在这里插入图片描述

转载地址:https://lion-wu.blog.csdn.net/article/details/108227675 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【redis】来吧,展示一下redis 发布-订阅模式
下一篇:【redis】redis内存管理、淘汰机制、内存优化

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月20日 09时12分41秒