Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Redis使用';排队';_C#_Redis_Stackexchange.redis - Fatal编程技术网

C# Redis使用';排队';

C# Redis使用';排队';,c#,redis,stackexchange.redis,C#,Redis,Stackexchange.redis,运行了一段时间后,我的应用程序Redis没有回答查询,只说排队。 当我执行代码中的所有事务时,事务似乎是打开的。 为什么交易没有完成?有没有办法检测并回滚它 我已经查看了事务对象,没有丢弃、回滚或类似的内容 问题开始时我有这个日志 StackExchange.Redis.RedisConnectionException: An unknown error occurred when writing the message at StackExchange.Redis.Conn

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

我已经查看了事务对象,没有丢弃、回滚或类似的内容

问题开始时我有这个日志

   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。

您的事务似乎没有正确结束。例如,在同一个redis连接中,不会对begin命令执行命令

以下是一个例子:

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中无法回滚,但通过以下方式放弃此事务:

> SET foo 1
OK
> MULTI
OK
> INCR foo
QUEUED
> DISCARD
OK
但我真正想要的是,有没有办法检测并回滚它

是的,可以检测错误。但redis本机不支持回滚。从redis文档:

如果您有关系数据库背景,那么在事务期间Redis命令可能会失败,但Redis仍将执行事务的其余部分,而不是回滚,这一事实可能会让您感到奇怪

然而,对于这种行为有一些好的看法:

只有使用错误的语法调用Redis命令(并且在命令队列中无法检测到问题)或针对持有错误数据类型的键调用Redis命令时,Redis命令才会失败:这意味着在实际情况下,失败的命令是编程错误的结果,并且是在开发过程中很可能检测到的错误,而不是在生产中。 Redis在内部简化且速度更快,因为它不需要回滚功能。 反对Redis观点的一个论点是错误会发生,但是应该注意的是,一般来说,回滚并不能避免编程错误。例如,如果查询将一个键增加2而不是1,或者增加了错误的键,则回滚机制无法提供帮助。考虑到没有人能够将程序员从错误中解救出来,并且Redis命令失败所需的错误不太可能进入生产环境,我们选择了更简单、更快的方法,即不支持错误回滚


谢谢鲁胡尔的回答。但我真正想要的是,有没有办法检测并回滚它?在我的例子中,发生了一个未知的异常,但是如何回滚它?或者干脆我应该再次尝试执行它?