Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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,使用C#检索我在Redis服务器上添加的密钥的值时,不会检索所有数据 例如,我有192.168.1.1号键,这个键的值是A$B$C$D$E$F$G$H,分隔符是$ 当我试图用这个c#代码从Redis检索192.168.1.1的值时 根据显示StringAppend用法的编辑,您似乎只是看到了查询时的中间值,特别是在处理多个线程或多个节点时。最终,如果一个代码路径通过APPEND建立值,而另一个代码路径在两个APPEND之间查询值,那么该值就是当时的值。如果要运行MONITOR,您可能会看到如下内

使用C#检索我在Redis服务器上添加的密钥的值时,不会检索所有数据

例如,我有192.168.1.1号键,这个键的值是A$B$C$D$E$F$G$H,分隔符是$

当我试图用这个c#代码从Redis检索192.168.1.1的值时


根据显示
StringAppend
用法的编辑,您似乎只是看到了查询时的中间值,特别是在处理多个线程或多个节点时。最终,如果一个代码路径通过
APPEND
建立值,而另一个代码路径在两个APPEND之间查询值,那么该值就是当时的值。如果要运行
MONITOR
,您可能会看到如下内容:

DEL 192.168.1.1
APPEND 192.168.1.1 A$
APPEND 192.168.1.1 B$
GET 192.168.1.1
APPEND 192.168.1.1 C$
APPEND 192.168.1.1 D$
在这种情况下,是的,来自
GET
的值将是
A$B$
,因为这就是当时的值

如果您想要原子性,那么您的代码需要提供原子性;有多种方法可以做到这一点,包括:

  • 将代码中的值串联起来,然后发出对
    StringSet
    的单个调用(这非常适合这样的小值)
  • 使用
    MULTI
    /
    EXEC
    (即StackExchange.Redis中的
    CreateTransaction()
    )创建操作的原子块(不确定这在这种情况下是否有意义,但在其他情况下可能有用)
  • 在构建不同的临时键时,将值写入该键,然后使用
    RENAME
    (StackExchange.Redis中的
    keyrame()
    )以原子方式交换键
  • 通过StackExchange.Redis中的
    EVAL
    ScriptEvaluate()
    )在Lua的服务器端执行操作块-同样,可能与此特定场景无关

  • 我自己选择选项1。

    根据显示
    StringAppend
    用法的编辑,您似乎只是看到了查询时的中间值,尤其是在处理多个线程或多个节点时。最终,如果一个代码路径通过
    APPEND
    建立值,而另一个代码路径在两个APPEND之间查询值,那么该值就是当时的值。如果要运行
    MONITOR
    ,您可能会看到如下内容:

    DEL 192.168.1.1
    APPEND 192.168.1.1 A$
    APPEND 192.168.1.1 B$
    GET 192.168.1.1
    APPEND 192.168.1.1 C$
    APPEND 192.168.1.1 D$
    
    在这种情况下,是的,来自
    GET
    的值将是
    A$B$
    ,因为这就是当时的值

    如果您想要原子性,那么您的代码需要提供原子性;有多种方法可以做到这一点,包括:

  • 将代码中的值串联起来,然后发出对
    StringSet
    的单个调用(这非常适合这样的小值)
  • 使用
    MULTI
    /
    EXEC
    (即StackExchange.Redis中的
    CreateTransaction()
    )创建操作的原子块(不确定这在这种情况下是否有意义,但在其他情况下可能有用)
  • 在构建不同的临时键时,将值写入该键,然后使用
    RENAME
    (StackExchange.Redis中的
    keyrame()
    )以原子方式交换键
  • 通过StackExchange.Redis中的
    EVAL
    ScriptEvaluate()
    )在Lua的服务器端执行操作块-同样,可能与此特定场景无关

  • 我自己会选择选项1。

    这似乎不太可能;我很高兴地认为有些事情是错误的,但是:你如何写这个价值?您是否可能(而且更有可能)看到某个东西的一个中间状态,该状态作为对
    APPEND
    的多个调用写入?注意:这里不需要使用
    StringGetAsync
    StringGet
    应该可以正常工作,但是:无论哪种方式,值都应该是不可变的,所以我认为这不重要。要强调的是:我不是说它不是库错误,而是。。。似乎首先排除更可能的原因是一个好主意(即
    APPEND
    )(还有:什么库版本、什么目标框架等)@marcGravel我也添加了APPEND函数。最新的Redis版本2.6.1和4.8.Net framework版本这似乎不太可能;我很高兴地认为有些事情是错误的,但是:你如何写这个价值?您是否可能(而且更有可能)看到某个东西的一个中间状态,该状态作为对
    APPEND
    的多个调用写入?注意:这里不需要使用
    StringGetAsync
    StringGet
    应该可以正常工作,但是:无论哪种方式,值都应该是不可变的,所以我认为这不重要。要强调的是:我不是说它不是库错误,而是。。。似乎首先排除更可能的原因是一个好主意(即
    APPEND
    )(还有:什么库版本、什么目标框架等)@marcGravel我也添加了APPEND函数。最新的Redis版本2.6.1和4.8.Net framework versionGet函数正在等待在Redis频道上广播的ok消息执行。插入功能完成后,ok消息将广播到redis频道。当我使用redis-cli.exe进行监控时,我分析认为没有并发。@Heisenberg k,但是:您所描述的将完全符合这种
    APPEND
    定时错误,因此:这似乎是最有可能的罪魁祸首-似乎不太可能(不是不可能,但不太可能)您发现了这样一种情况:库不知何故读取了错误的字节数,却没有注意到(这些是RESP术语中的大容量字符串,因此有效负载长度是前缀-这里甚至不需要进行任何思考)。你有什么可复制的演示我可以看吗?另外一个想法:您是否正在查询可能落后几毫秒(或更多)的副本?当我测试几次时,我发现存在并发问题。频道信息广播时间错误。比
    DEL 192.168.1.1
    APPEND 192.168.1.1 A$
    APPEND 192.168.1.1 B$
    GET 192.168.1.1
    APPEND 192.168.1.1 C$
    APPEND 192.168.1.1 D$