Redis事务深度解析:掌握数据一致性核心攻略

创始人
2024-12-18 19:26:43
0 次浏览
0 评论

不可不知的Redis秘籍:事务命令全攻略!

Redis事务完整解析与实用指南

在数据处理的世界里,事务是数据一致性的重要保障。
它保证在一组操作中全部成功或全部失败。
这是“全有或全无”的原则,确保数据的完整性和一致性。

我们深入理解一下Redis事务:它是一系列命令的串行化执行,从MULTI开始,将命令逐个添加到队列中,直到EXEC命令执行完整个队列。
Redis事务没有隔离级别,但不保证原子性。
即使某个命令失败,其他命令仍然可能执行。

使用时,事务具有以下特征和命令:

MULTI:打开事务并对命令进行排队。
EXEC:执行事务并立即执行所有排队的命令。
DISCARD:取消交易并放弃未执行的命令。
WATCH:监视密钥,如果密钥发生更改,交易将中止。
别看:别看。

Redis事务的优点是批量操作和事务隔离,但可能会牺牲一些性能。
了解这些命令有助于提高数据操作的效率和安全性。

以下是使用Redis事务的一些示例:

正常执行:设置键值并原子提交。
取消事务:中止并保持数据完整。
错误处理:事务队列中的错误导致事务中止。
监控:使用WATCH来管理键值变化。

熟练使用Redis事务,可以提高数据处理的准确性和稳定性。
如果您需要深入学习或实践,【云端元象】平台提供了大量资源,包括课程、教程、实践链接。
点击开始您的学习之旅!

我们下期再见,继续探索Redis的更多奥秘!

redis支持事务吗

概述

相信学过MySQL等数据库的同学都对事务这个词很熟悉。
事务代表一组操作,这些操作要么全部执行,要么根本不执行。
为什么有这样的需要呢?看一下下面的场景:

微博是一个弱关系的社交网络。
用户之间存在两种关系:关注和被关注。
例如,两个用户A和B。
如果A关注了BB,那么粉丝中应该有A。
执行此操作需要两个步骤:将B添加到A的关注者;要么两个操作都成功,要么两个操作都不成功。
否则,可能会出现A追随B,而B的粉丝中却没有A的难以忍受的情况。

转账汇款,假设有A、B两个账户,现在您需要从A账户转10000元到B账户。
这个动作也需要两个步骤才能完成:从A的账户,转入10000元。
B;B账户上增加了10000元。
这两个动作要么全部执行,要么都不执行,不然就会有人跟你打招呼!!!

Redis作为高效的分布式数据库,也支持事务。

Redis事务

Redis中的事务是命令的集合。
事务和命令一样,是Redis的最小执行单元,一个事务中的命令要么全部执行,要么都不执行。
Redis事务的实现需要用到两个命令,MULTI和EXEC。
当事务开始时,首先向Redis服务器发送MULTI命令,然后发送本次事务要处理的命令,发送EXEC命令表示事务命令结束。

例如,使用redis-cli连接redis,然后在命令行工具中输入以下命令:

MULTIOK1127:0.0。
6379>seturlg.meQUEUED127.0.0.1:6379>settitlewinwill2012QUEUED127.0.0.1:6379>setdescjavaQUEUED127.0.0.1:6379>EXEC1)OK2)OK3)OK127.0.0.1:6379>127.0.79>.13h.13h.13h0.0.1:6379>gettitle"winwill2012"127.0.0.1:6379>getdesc"java"127.0.0.1:6379>

从输出中可以看出,当输入MULTI命令时,服务器会返回OK事务启动成功,然后输入本次事务中需要执行的所有命令,每次输入命令时,服务器不会立即执行,而是返回“QUEUED”,这意味着该命令已被服务器接受并暂时存储起来以便按顺序执行。
您终于可以看到服务器一次返回了三个OK。
这里返回的结果对应于按顺序发送的命令,意味着本次事务中的所有命令都被执行了。

再例如,在命令行工具中输入以下命令:

MULTIOK127.0.0.1:6379>setaaQUEUED127:679.>127:679.>settbb(error)ERRunknowncommand'sett'127.0.0.1:6379>setccQUEUED127.0.0.1:6379>EXEC(error)EXECABORTTransactiondiscarded因为seofpreviouserrors.127.0.0.1:6379>geta(nil)127.0.0.1:6379>getb(nil)127.0.0.1:6379>getc(nil)127.0.0.1:6379>

与前面的示例相同,首先键入MULTI,然后键入EXEC以指示中间命令属于事务。
不同的是中间命令有错误(set写成set,因为是错误命令,否则)。
事务中的命令不会被执行(通过后续的get命令可以验证),可见事务中的所有命令同命运。

如果客户端在发送EXEC命令之前断开连接,服务器将刷新事务队列,并且事务中的所有命令都不会被执行。
当客户端发送EXEC命令时,事务中的所有命令都会被执行。
即使客户端随后断开连接也没关系这是因为服务器已经存储了事务中的所有命令。

Redis事务除了保证事务中的所有命令要么全部执行,要么根本不执行,还可以保证事务中的命令顺序执行,不会被其他命令插入。
想象一下,客户端A需要执行多个命令,客户端B同时发送多个命令,如果使用事务,则可以将客户端B的命令插入到客户端A的多个命令中。
如果想避免这种情况,也可以。
使用交易。

Redis事务错误处理

如果在事务中执行命令时发生错误,Redis将如何处理?要回答这个问题,我们首先要找出导致命令执行错误的原因:

语法错误就像上面的例子一样,语法错误意味着命令不存在或者参数错误,其中这种情况,一定要区分Redis的版本,Redis2.6.5之前的版本会忽略不正确的命令并执行其他正确的命令,2.6.5之后的版本会忽略该事务中的所有命令,不会执行,如示例以上(使用的Redis版本为2.8)

运行错误运行错误表示命令执行过程中发生错误,例如使用GET命令获取哈希表类型键值。
此类错误只有在命令执行后才能被Redis检测到,因此事务中的此类命令将被Redis接受并执行。
如果在执行feed中的命令时出现错误,其他命令仍将被执行(包括错误后的命令)。
例如:

MULTIOK127.0.0.1:6379>setkey1QUEUED127.0.0.1:6379>SADDkey2QUEUED127.0.0.1:6379>setkey3QUEUED127.0.0.1:6379>EXEC1)OK2)(错误)WRONGTYPEOperationgainstakeyholdingthewrongtypeofvalue3)OK127.0.0.1:6379>getkey3

交易于Redis不具备关系数据库中事务回滚的功能,所以用户必须自己清理剩余的乱七八糟的东西。
不过,由于Redis不支持事务回滚,这也使得Redis事务变得简单、快速。

当我们记住这两类错误时,就可以在开发过程中检测到语法错误并进行处理。
此外,如果可以很好地规划Redis数据密钥的使用,命令和密钥错误将不会成为问题。

WATCH命令

从上面的例子中我们可以看出,只有事务中的所有命令都执行完毕之后才能得到每个命令的结果,但是如果一个事务中的命令B如果取决于他最后一个命令A的结果怎么办?例如,要在Java中实现类似i++的函数,必须先获取当前值,然后在当前值上加一。
这种情况仅仅使用上面介绍的MULTI和EXEC是无法实现的,因为MULTI和EXEC中的命令是一起执行的,一个命令的执行结果不能作为另一个命令的执行参数,所以这个时候就需要介绍一下Redis事务家族的另一个成员:WATCH命令

换个角度思考上面提到的i++的实现方法,可以这样实现:

Watchthevalue我到确保i的值不改变

获取i的原始值

如果过程中i的值没有改变,则当前的i值+1,否则不执行

这样可以避免竞争条件,保证i++能够正确执行。

WATCH命令可以监控一个或多个key,当其中一个key被改变(或删除)时,后续的事务将不会被执行,监控会一直持续到EXEC命令(在该命令中)。
i交易已执行。
EXEC后执行EXEC命令后,被监视的按键将自动变为UNWATCH)

例如:

12。
3456789101112131415127.0.0.1:6379>setmykey1OK127.0.0.1:6379>WATCHmykeyOK127.0.0.1:6379>setmykey2OK127.0.0.1:6372.60IOK11.9>60IOK11.9>60IOK17.9。
etmykey3QUEUED127.0.0.1:6379>EXEC(nil)127.0.0.1:6379>getmykey"2"127.0.0.1:6379>

在上面的例子中,首先将mykey的键值设置为1,然后使用WATCH命令监控mykey然后改变mykey的值为2,然后进入交易,设置该值将事务中的mykey改为3,然后运行EXEC运行事务中的命令,最后使用get命令查看mykey的值,发现mykey的值仍然是2,即事务中的命令根本不执行(因为在WATCH监控mykey的时候mykey被改变了,所以后续的交易会被取消)。

通过WATCH命令我们可以自己实现i++函数。
伪代码如下:

1234567891011defincr($key):WATCH$key$value=GET$keyifnot。
$value$value=0$value=$value+1MULTISET$key$valueresult=EXECreturnresult[0]

因为EXEC返回的是多行字符串,所以用result[0]来表示返回值。
一个字符串。

注意:由于WATCH命令的功能只是在监视的key改变后取消事务,并不能保证其他客户端不会改变监视的值,所以当EXEC命令失败时,它是手动重新启动的。
完成整个交易。

执行EXEC命令后,WATCH命令监控的按键将无人值守。
如果不想执行事务中的命令,也可以使用UNWATCH命令取消监视。

下单时如何保证数据一致性?Redis事务与管道详解

处理更高订单时,确保数据一致性是关键。
数据播种和读写操作的便利性可能会导致数据不一致。
本文详细讲解了Redis中解决该问题的事务和管道方法。

面临的问题包括:如何保证数据的一致性,如何提高高层会议的指挥控制。
具体要求如下:

用户下单后,必须进行订单支付操作,并验证支付与订单状态的一致性。

支付成功后,订单状态应更新为已支付,以保持数据一致性。

在超融合环境中,必须保证负载性能和数据一致性。

我们可以利用Redis的事务和管道方式来解决上述问题。
首先,了解事务和管道的基本概念及其好处。

Redis事务

Redis事务是一组命令,确保命令的弹性、一致性、隔离性和持久性。
使用交易的关键步骤包括发起交易、执行订单和执行交易。

事务示例

说明在Java代码示例中使用事务。
在事务中,您执行一系列命令,例如设置键值对,当您执行该命令时,所有操作都会失败或无法保证数据一致性。

Redis管道

管道允许将多个命令同时发送到Redis服务器,从而减少通信开销并提高性能。
管道可以将多个订单打包在单个连接中执行,从而大大提高了组操作的效率。

管道优化性能

管道可以显着降低服务器负载,提高处理能力。
在高流量的情况下,特别是同时收费较高的情况下使用管道,可以有效提高性能。

案例分析

以网上商城为例,展示如何使用交易来保证支付和订单状态的一致性,以及如何使用管道来促进支付执行。
代码示例中收取批量操作费用、通信费用减少并提高系统响应能力。

限制与注意事项

使用事务时,要注意使用WATCH命令和亮锁,以保证事务的完整性和数据的一致性。
管道不支持事务,因此使用时必须考虑性能影响,避免订单之间相互阻塞。

总结

本文探讨了Redis事务和管道机制的实现,以确保数据一致性和优化性能。
通过详细的解释和代码示例,它展示了如何选择正确的方法来在实际业务中获得最佳结果。
无论是强调一致性还是跟踪性能,都有适用的条件和注意事项,应根据业务需求灵活使用。

redis是如何执行的

对于任何技术,如果你只处于“懂得使用”的水平,那将很难有所成就,甚至可能面临被解雇、找不到工作的风险相信你能读懂这篇文章,你一定是一个有上进心、想要有所作为的人,所以借此机会详细了解Redis实现的细节。

客户端和服务器基于socket进行通信服务器在启动时会创建一个socket监听器来监听连接到客户端的socket链接源码如下:

红色是利用I/O复用功能来监听多个socket链接,这样就可以用一个线程链接来处理多个请求,减少了线程切换带来的开销,同时也避免了I/O阻塞操作,从而提高了Redis的运行效率。

简单来说,这一步的实现过程如下:

当数据大小验证通过后,服务器会分析输入缓冲区中的请求命令,提取命令请求中包含的命令参数,并将其存储到客户端对象中(服务器会为客户端创建一个Client对象)每个链接)在属性中。

①判断是否为退出命令,如果是则直接返回

②考虑不为null,检查客户端对象是否为null,如果是则返回;错误消息;

③获取执行命令,根据client对象中存储的属性信息在redisCommand结构体中查询执行命令

④用户授权认证,未通过认证的客户端只能执行执行AUTH命令(授权)如果认证失败的客户端执行AUTH以外的命令,会返回错误信息

⑤集群相关操作,如果是集群模式,重定向命令;目标节点,如果是parent(父节点)则不需要重定向

⑥检查服务器端最大内存限制如果服务器端开启了最大内存限制,则内存大小会先检查内存是否超过了maximum值,内存会被回收;

⑦持久化检测,检查服务器是否启用持久化,持久化出错时停止写入配置,如果启用该配置,持久化失败,禁止执行。

⑧验证最小从节点(slave)集群模式,如果是集群模式并且配置了replminslavestowrite(最小从节点写入),当从节点数量小于配置项时,执行写入命令禁止

⑨只读从节点认证,当服务器为只读从节点时,只接受来自主节点的写命令;

⑩客户订阅注意事项:客户订阅频道时,只会执行部分命令(仅执行SUBSCRIBE、SUBSCRIBE、UNSUBSCRIBE和PUNSUBSCRIBE,其他命令将被拒绝)。

⑪从节点状态验证,当服务器为从节点且未连接主节点时,仅执行与状态查询相关的命令,例如信息等。
会被执行;

⑫服务器启动验证,当服务器启动时,只会执行带loading标志的命令,其他命令会被拒绝;

⑬脚本⑬lua区块验证当服务器由于Lua脚本被阻塞而出现故障时,只会执行部分命令;

⑭交易命令的验证,如果执行了交易命令,则启动交易并将命令放入等待队列;

⑮监控根据监控器的判断,如果服务器开启了监控功能,服务器也会向监视器发送执行指令和相关参数(监视器用于监视服务器的运行状态)。

服务器完成上述操作后,就可以执行实际的操作命令了。

第六步:执行后相关记录及统计①检查是否开启慢查询,会记录慢查询日志②检查统计信息是否开启开启,会记录一些统计信息,如执行Elapsedtime命令,(调用)计数器加1。
③检查持久化功能是否开启,持久化信息会被记录;④如果另一个从服务器复制了当前服务器,则新执行的命令将传播到另一个从服务器。

第七步:返回结果给客户端命令执行完毕后,服务器将执行结果通过socket发送给客户端,客户端将结果显示给用户。
命令执行已结束。

总结:当用户输入命令时,客户端会将数据以socket的形式转换为Redis协议并发送给服务器,服务器收到数据后,首先会进行协议转换进入真正的Redis协议执行命令是经过各种验证的,保证命令能够正确、安全的执行,但是验证完成后,会调用一定的方法来执行命令,相关的统计和记录会被记录下来。
执行,然后将执行结果返回给客户端。

文章标签:
Redis 事务
热门文章
1
SQL2000数据库备份压缩技巧:优化空... 怎么将SQL2000中的较大的备份数据库压缩变小更改数据库属性-选项-恢复模型很...

2
高效掌握:CMD命令轻松启动、关闭及登录... 如何用cmd命令快速启动和关闭mysql数据库服务开发中经常使用MySQL数据库...

3
SQL字符串处理技巧:单引号使用与转义标... SQL语句中,字符串类型的值均使用什么符号标明?单引号如果字符串内有单引号,请小...

4
Windows环境下Redis安装指南与... redis安装windowsredis基本简介与安装安装Redis首先需要获取安...

5
深度解析:Redis性能优势与局限性,助... redis有哪些优缺点?Redis的全称是RemoteDictionary.Se...

6
深入解析:MySQL数据库的特性与应用 mysql是什么MySQL是一个关系数据库管理系统。MySQL是一个开源关系数据...

7
解决MYSQL 1064错误:proje... MYSQL建表1064错误?这是由于project_state参数设置为非零值且...

8
零基础入行Java:五步助你掌握编程技巧 北大青鸟java培训:零基础小白如何快速入行JAVA?很多JAVA编程初学者在第...

9
MySQL日期存储选择:DateTime... MySQL保存日期,用哪种数据类型合适?datetime?timestamp?还...

10
掌握MySQL常用命令:高效管理数据库的... MySQL数据库常用命令(新建/删除/查询&am...