C# Redis不会从数据库中检索所有数据
使用C#检索我在Redis服务器上添加的密钥的值时,不会检索所有数据 例如,我有192.168.1.1号键,这个键的值是A$B$C$D$E$F$G$H,分隔符是$ 当我试图用这个c#代码从Redis检索192.168.1.1的值时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,您可能会看到如下内
根据显示
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()
)以原子方式交换键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()
)以原子方式交换键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$