Могу ли я как-то пометить данные в Redis?

#caching #redis

Вопрос:

У меня есть объект Company и несколько методов, которые можно использовать для получения этого объекта. например GetById , GetByEmail ,. GetByName Я бы хотел кэшировать эти вызовы методов с возможностью аннулировать все записи кэша, связанные с одним объектом, сразу.

Например, компания кэшируется. В кэше есть 3 записи со следующими ключами:

  1. Company:GetById:123
  2. Company:GetByEmail:foo@bar.com
  3. Company:GetByName:Acme

Все три ключа связаны с одной компанией.

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

Ответ №1:

Поэтому, чтобы ответить на ваш вопрос напрямую, вы, вероятно, захотите сохранить все ключи, связанные с вашей компанией, в списке, просмотреть этот список и удалить все связанные ключи с помощью команды DEL.

Так что что-то вроде:

 LPUSH companies-keys:Acme Company:GetById:123 Company:GetByEmail:foo@bar.com Company:GetByName:Acme
 

Затем

 RPOP companies-keys:Acme
 

и для каждой записи вы выходите из списка:

 UNLINK keyname
 

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

Чтобы вы могли создать его с помощью:

 HSET companies:123 id 123 email foo@bar.com name acme
 

Затем вы можете обновить конкретную запись в записи компании с помощью HMSET:

 HMSET companies:123 email bar@foo.com
 

Поскольку похоже, что возможность поиска данной записи по разным полям действительно важна для вашего варианта использования — вы также можете рассмотреть возможность добавления повторного поиска и индексации полей, которые вы хотите иметь возможность искать в разных полях для набора полей, перечисленных выше, и индекса:

 FT.CREATE companies-idx ON HASH PREFIX 1 companies: SCHEMA id TAG email TEXT name TEXT
 

Может быть уместно — тогда вы могли бы найти компанию с данным электронным письмом, например:

 FT.SEARCH companies-idx "@email: foo"
 

Комментарии:

1. Проблема с решением с list заключается в том, что в этом случае мне понадобится один ключ списка для доступа к этому списку с ключами. Поэтому, чтобы получить доступ к компании по электронной почте, я должен знать название компании (в соответствии с приведенным примером). Хэш в сопровождении RediSearch, похоже, удовлетворяет все мои потребности, но я бы предпочел, чтобы он был простым и не изменял существующую настройку Redis. Буду расследовать дальше, но все равно спасибо.