Список ручек в Redis - PullRequest
       7

Список ручек в Redis

1 голос
/ 02 марта 2020

Большой набор основных данных (50K записей в списке) необходимо кэшировать с помощью Redis. но приложение будет извлекать отдельные записи из основных данных. Имеет ли смысл сериализовать 50К-записи в списке и сохранять их в Redis, и каждый раз получать сериализованную строку и десериализовывать в объект List и запрашивать с помощью linq и возвращать одни данные? например store

IDistributedCache _cache

// data is list<object> of size 50K
var jsonString = JsonConvert.SerializeObject(data);
await _cache.SetStringAsync(key, jsonString, options);

retrieve

var cachedItem = await _cache.GetStringAsync(key);
var result = JsonConvert.DeserializeObject<T>(cachedItem);
...
return result.where(x=>x.Id=id) 

, поскольку объект DeserializeObject большой строки неэффективен. Если я буду хранить один за другим в Redis, и если есть требование, что он также должен быть сохранен как единое целое, то я беспокоюсь, что произойдет дублирование данных, сохраняющее одни и те же данные дважды. вот почему я предпочитаю хранить 50K в целом.

любой совет?

1 Ответ

1 голос
/ 02 марта 2020

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

var result = JsonConvert.DeserializeObject<T>(cachedItem);
...
return result.where(x=>x.Id=id) 

настоятельно предполагает, что здесь происходит что-то очень неэффективное. Если вы хотите иметь возможность выбирать по ключу, более очевидной моделью здесь будет redis ha sh с использованием Id в качестве ключа и сериализованной полезной нагрузки для каждого значения (HashSet[Async]). Затем вы можете извлекать, добавлять, обновлять или удалять индивидуальные элементы по отдельности; Вы также можете получить все, если нужно (HashGetAll[Async] / HashScan[Async]).

Вы также можете хранить каждый элемент индивидуально (StringSet[Async]), используя id как часть ключа , но если вы сделаете это, то не будет хорошего механизма для получения всего списка.

...