在检索使用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/

    10-16 07:13