Клиент ServiceStack Redis Get <T>(ключ) удаляет кавычки из строковых данных - PullRequest
0 голосов
/ 19 февраля 2019

Я использую библиотеку ServiceStack.Redis для работы с Redis.Для начала я реализовал это решение.Методы get / set работают нормально для простого текста / строки.

Теперь, когда я сохраняю строку с кавычками (с escape-символом), она сохраняется правильно (я проверяю то же самое в redis-cli).Но метод Get возвращает строку, в которой удалены все двойные кавычки.

Например, при сохранении этой строки - «TestSample» сохраняется и получается как ожидалось.Кроме того, сохранение "TestSample \" с \ "\" кавычками \ "" нормально и показывает то же самое в redis-cli.Но вывод метода Get становится "TestSample with quotes"

     public bool SetDataInCache<T>(string cacheKey, T cacheData)
    {

        try
        {
            using (_redisClient = new RedisClient(_cacheConfigs.RedisHost))
            {                   
                _redisClient.As<T>().SetValue(cacheKey, cacheData, new TimeSpan(0,0,300));
            }

            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

    public T GetDataFromCacheByType<T>(string cacheKey)
    {
        T retVal = default(T);

        try
        {
            using (_redisClient = new RedisClient(_cacheConfigs.RedisHost))
            {
                if (_redisClient.ContainsKey(cacheKey))
                {
                    var wrapper = _redisClient.As<T>();
                    retVal = wrapper.GetValue(cacheKey);
                }
                return retVal;
            }
        }
        catch (Exception ex)
        {                
            return retVal;
        }

}

Использование:

   cacheObj.SetDataInCache("MyKey1","TestSample");
   cacheObj.SetDataInCache("MyKey2","TestSample \"with\" \"quotes\"");

   string result1 = Convert.ToString(cacheObj.GetDataFromCacheByType<string>("MyKey1"));
   string result2 = Convert.ToString(cacheObj.GetDataFromCacheByType<string>("MyKey2"));

Actual: "TestSample withкавычки "

Ожидается:" TestSample \ "с \" \ "кавычками \" "

1 Ответ

0 голосов
/ 19 февраля 2019

Typed Generic API предназначен только для создания универсального Redis Client для сериализации сложных типов.Если вы реализуете общий кэш, вы должны использовать вместо этого IRedisClient API, например:

_redisClient.Set(cacheKey, cacheData, new TimeSpan(0,0,300));

Затем получить обратно с помощью:

var retVal = _redisClient.Get<T>(cacheKey);

В качестве альтернативы для сохранения строк или, если выЕсли вы хотите сериализовать POCO самостоятельно, вы можете использовать строковые API-интерфейсы IRedisClient SetValue / GetValue, например:

_redisClient.SetValue(cacheKey, cacheData.ToJson());
var retVal = _redisClient.GetValue(cacheKey).FromJson<T>();

Примечание: вызов IRedisClient.ContainsKey() выполняет дополнительную ненужную операцию ввода-вывода Redis, посколькувы все равно возвращаете default(T), вам нужно просто позвонить _redisClient.Get<T>(), который возвращает значение по умолчанию для несуществующих ключей.

...