#caching #redis
Вопрос:
У меня есть объект Company
и несколько методов, которые можно использовать для получения этого объекта. например GetById
, GetByEmail
,. GetByName
Я бы хотел кэшировать эти вызовы методов с возможностью аннулировать все записи кэша, связанные с одним объектом, сразу.
Например, компания кэшируется. В кэше есть 3 записи со следующими ключами:
Company:GetById:123
Company:GetByEmail:foo@bar.com
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. Буду расследовать дальше, но все равно спасибо.