在检索使用C#在Redis Server上添加的键的值时,不会检索所有数据。
例如,我有键192.168.1.1,此键的值A $ B $ C $ D $ E $ F $ G $ H和分隔符$用于拆分。
当我尝试使用此C#代码从Redis检索192.168.1.1的值时;
public string GetCurrentVersion(string clientName)
{
return PipelineGet(redis.GetDatabase().StringGetAsync(clientName + ",Plugins"));
}
private string PipelineGet(Task<RedisValue> value)
{
try
{
var result = redis.GetRedis().Wait(value);
if (result.ToString() == null)
{
return "";
}
return result.ToString();
}
catch (Exception ex)
{
return "";
}
}
它返回192.168.1.1的值,例如ABCD或ABCDE或AB或ABCDEEFGH。有时检索所有数据,但有时无法检索。不等待稳定地检索所有数据。有人可以解释这个原因吗?
这是插入函数;
public void InsertCurrentVersion(string clientName, string pluginName, string currentVersion)
{
redis.GetDatabase().StringAppend(clientName + ",Plugins", pluginName + "," + currentVersion + "$");
}
最佳答案
根据显示StringAppend
用法的编辑,似乎您只是在查询时就看到中间值,特别是在处理多个线程或多个节点时。最终,如果一个代码路径通过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中的KeyRename()
)原子交换键EVAL
(StackExchange.Redis中的ScriptEvaluate()
)在Lua服务器端执行操作块-再次,可能与此特定方案我会自己选择选项1。
关于c# - Redis不会从数据库中检索所有数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61225529/