2015-08-27 3 views
1

У меня есть большое количество предметов, хранящихся в сортированном наборе Redis (порядка 100 000), которые довольно часто обновляются. Этими объектами являются объекты, закодированные как строки JSON, и ранжирование для сортировки в наборе выводится (на вставке, по моему коду) из свойства даты/времени объекта.Удалить из Redis Sorted Set на основе свойства JSON

Каждый элемент в наборе имеет свойство Id (которое представляет собой Guid, закодированное как строка), которое однозначно идентифицирует элемент в системе.

Когда эти элементы обновляются, мне нужно либо обновить элемент в отсортированном наборе, либо удалить и снова вставить элемент. Проблема заключается в том, как найти этот элемент для выполнения операции.

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

Есть ли у кого-нибудь какие-либо предложения относительно того, как это сделать более эффективно? Единственный уникальный идентификатор, который у меня есть для элементов, - это свойство Id, закодированное в элементе.

Большое спасибо,

Richard.

ответ

3

Возможно, ваш случай - всего лишь плохой выбор дизайна.

Вы не должны хранить строки JSON в отсортированных наборах: вам нужно хранить идентификаторы, а целые сериализованные объекты JSON должны храниться в хеше .

Таким образом, когда вам нужно обновить объект, вы обновите весь хэш-ключ, используя hset, и вы сможете найти весь объект по его уникальному идентификатору.

С другой стороны, любой ключ в хеше должен присутствовать в вашем отсортированном наборе. Когда вы добавляете объект в отсортированный набор, вы добавляете его уникальный идентификатор.

Когда вам нужно перечислить свои объекты в определенном порядке, вы выполните следующие операции:

  1. Вы получаете страницу идентификаторов из отсортированного набора (например, с помощью zrange).
  2. Вы получаете все объекты со страницы, указав их идентификаторы команде hmget.
+0

Рекомендуется использовать Хэш для хранения данных ID-> JSON, но не обязательно, поскольку вы можете использовать String для хранения JSON каждого ID под своим собственным ключом. Тем не менее, Хэш предпочтительнее с точки зрения ОЗУ из-за Redis на ключевые накладные расходы. –

+0

@ItamarHaber Эй, как дела? ;) Да, я использовал подход с строковым ключом, пока не понял, что hases лучше не только из-за оптимизации памяти, но также и потому, что кто хочет глобальное пространство ключей, задуманное с помощью миллионов ключей, когда вы можете организовать их в подразделах –

+0

Hola :) Как у OCD-wannabe я получаю это, но по всем практическим причинам (исключая оптимизацию ОЗУ) разделы не очень полезны, если вы не сканируете пространство ключей - плохая идея в большинстве случаев - или выполняете «пакетные» операции над подразделами (например, массовое удаление). OTOH, они добавляют еще один O (logn) для получения значения ... –

Смежные вопросы