首页 > 解决方案 > 我可以在 Redis 中以某种方式标记数据吗?

问题描述

我有一个对象Company和多个方法可以用来获取这个对象。前任。GetById, GetByEmail, GetByName. 我想要的是缓存这些方法调用,并有可能一次使与一个对象相关的所有缓存条目无效。

例如,缓存了一家公司。缓存中有 3 个条目,具有以下键:

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

所有三个密钥都与一家公司相关。

现在让我们假设公司发生了变化。然后我想使与该公司相关的所有密钥无效。我没有找到任何用于此目的的内置解决方案。用一些常见的 id(例如companyId)标记缓存条目,然后通过它删除所有条目会很好,但这个功能似乎不存在。

标签: cachingredis

解决方案


因此,要直接回答您的问题,您可能希望在列表中维护与您的公司相关的所有键,扫描该列表,并使用 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

由于听起来能够通过不同字段查找给定记录对您的用例非常重要 - 您可能还需要考虑添加RediSearch并索引您希望能够在不同字段上搜索字段集的字段上面列出的,和索引:

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

可能是合适的-然后您可以使用给定的电子邮件查找公司,例如:

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

推荐阅读