Redis не получает все данные из базы данных - PullRequest
1 голос
/ 15 апреля 2020

При получении значений ключей, которые я добавил на Redis Server с помощью C#, все данные не восстанавливаются.

Например, у меня есть ключ 192.168.1.1 и значение этого ключа A $ B $ C $ D $ E $ F $ G $ H с разделителем $ для разделения.

Когда я пытаюсь получить значение 192.168.1.1 из Redis с этим кодом c#;

    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 + "$");
    }

1 Ответ

0 голосов
/ 15 апреля 2020

Основываясь на редактировании, которое показывает использование 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$, потому что это то, что значение в это время .

Если вы хотите атомарность, то это то, что ваш код должен предоставить; Есть несколько способов сделать это, в том числе:

  1. объединить значения в вашем коде , а затем выполнить одиночный вызов StringSet (это идеально для небольших значений, подобных этому )
  2. используйте MULTI / EXEC (т. Е. CreateTransaction() в StackExchange.Redis), чтобы создать блок операций atomi c (не уверен, что это имеет смысл в этом контексте, но может быть полезно в другом сценарии ios)
  3. записать значения в другой временный ключ во время его построения, а затем использовать RENAME (KeyRename() в StackExchange.Redis) для поменять местами ключи атомно
  4. выполнить блок операций на стороне сервера в Lua через EVAL (ScriptEvaluate() в StackExchange.Redis) - опять же, вероятно, не относится к этому параметру c сценарий

Я бы go с вариантом 1 сам.

...