首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis用“排队”回答所有查询

问Redis用“排队”回答所有查询
EN

Stack Overflow用户
提问于 2019-07-31 08:12:05
回答 1查看 674关注 0票数 2

过了一段时间,我的应用程序Redis没有回答查询,只说排队。当我在代码中执行所有事务时,事务似乎是打开的。为什么交易没有完成?是否有检测和回滚的方法?

我看了一下事务对象,没有丢弃、回滚或类似的东西。

问题开始的时候我有这个日志。

代码语言:javascript
复制
   StackExchange.Redis.RedisConnectionException: An unknown error occurred when 
   writing the message
   at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message 
   message, ResultProcessor`1 processor, ServerEndPoint server)
   at StackExchange.Redis.RedisTransaction.Execute(CommandFlags flags)

当Redis继续回复“排队”时,监视器命令只是记录PING。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-31 13:48:57

你的交易似乎没有正确结束。例如,对于同一redis连接中的begin命令MULTY,不执行MULTY命令。

下面是一个示例:

代码语言:javascript
复制
127.0.0.1:6379> MULTI                                                                                               
OK                                                                                                                      
127.0.0.1:6379> set x 123                                                                                            
QUEUED                                                                                                                                  
127.0.0.1:6379> set y 456                                                                                               
QUEUED                                                                                                                  
127.0.0.1:6379> set z 678                                                                                               
QUEUED                                                                                                                  
127.0.0.1:6379> exec                                                                                                    
1) OK                                                                                                                   
2) OK                                                                                                                   
3) OK                       

无论您在命令MULTY之后输入了多少,在执行EXEC命令之前,始终会显示排队的。仔细检查代码,如果

交易开始后遗漏的任何东西

或者使用相同的共享redis连接对象来存储值。

更新:注释中的:回滚在redis中是不可能的,但是通过以下方式丢弃此事务:

代码语言:javascript
复制
> SET foo 1
OK
> MULTI
OK
> INCR foo
QUEUED
> DISCARD
OK

但我真正要寻找的是,有一种检测和回滚的方法吗?

是的,有可能检测到错误。但是回退并不是由redis支持的。从红宝石的文档:

Why Redis does not support roll backs? 如果您有关系数据库背景,那么Redis命令在事务期间可能会失败,但是Redis将执行事务的其余部分而不是回滚,这在您看来可能很奇怪。 然而,对于这种行为有很好的看法: 只有在使用错误的语法调用(在命令排队期间无法检测到问题)或针对包含错误数据类型的键时,Redis命令才能失败:这意味着,在实际情况下,失败的命令是编程错误的结果,并且是在开发过程中非常可能检测到的错误,而不是在生产中检测到的错误。Redis是内部简化和更快,因为它不需要回滚的能力。一个反对Redis观点的观点是,错误会发生,但是应该注意的是,通常回滚并不能使您免于编程错误。例如,如果查询将密钥增量为2而不是1,或者增加了错误的键,则回滚机制无法提供帮助。考虑到没有人能够避免程序员的错误,并且Redis命令失败所需的错误类型不太可能进入生产阶段,我们选择了一种更简单、更快的方法,不支持错误回滚。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57286118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档