Обработать список в Redis

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

IDistributedCache _cache

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

забрать

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

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

любой совет?


person Navin    schedule 02.03.2020    source источник
comment
это было бы перебором   -  person Ehsan Sajjad    schedule 02.03.2020
comment
хранить каждый элемент отдельно в кеше, индексируя идентификатор как ключ кеша, если это работает в вашем сценарии   -  person Ehsan Sajjad    schedule 02.03.2020


Ответы (1)


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

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

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

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

person Marc Gravell    schedule 02.03.2020
comment
Спасибо за комментарий. но я не знаю, что этот IDistributedCache поддерживает HashSet, HashGetAll, HashScan - person Navin; 02.03.2020
comment
Я вижу, нам нужно использовать IConnectionMultiplexer? - person Navin; 02.03.2020
comment
@ Халк, а где в своем вопросе ты процитировал IDistributedCache? Я вижу тег для stackexchange.redis, который является API, который я использовал здесь... - person Marc Gravell; 02.03.2020
comment
@Hulk, если вы ограничены этим API, вам придется использовать функции, поддерживаемые этим API, что означает либо сохранение всего списка, либо сохранение для каждой записи; честно говоря, ни один из вариантов не является хорошим, поэтому вам нужно решить: принять ограничения этих вариантов или использовать более широкий набор функций Redis, которые существуют, но требуют использования другого API; любой подход действителен, и только вы можете решить - person Marc Gravell; 02.03.2020