【问题标题】:Can I somehow tag data in Redis?我可以在 Redis 中以某种方式标记数据吗?
【发布时间】:2021-09-03 08:14:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: caching redis


    【解决方案1】:

    因此,要直接回答您的问题,您可能希望在一个列表中维护与您的公司相关的所有键,扫描该列表,然后使用 DEL 命令删除所有关联的键。

    比如:

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

    然后

    RPOP companies-keys:Acme
    

    对于您从列表中删除的每个条目:

    UNLINK keyname
    

    要不那么直接地回答它,您可能需要考虑使用Hash 而不仅仅是键,这样您就可以只修改散列中的一个字段,而不必使与之关联的所有键无效。

    所以你可以用:

    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"
    

    【讨论】:

    • list 解决方案的问题是,在这种情况下,我需要一个列表键来访问该列表键。因此,为了通过电子邮件访问公司,我必须知道公司名称(根据提供的示例)。带有 RediSearch 的哈希似乎可以满足我的所有需求,但我宁愿保持简单,而不是修改现有的 Redis 设置。将进一步调查,但无论如何感谢。
    猜你喜欢
    • 2015-07-05
    • 1970-01-01
    • 2023-03-18
    • 2012-06-14
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2019-10-15
    • 2023-02-14
    相关资源
    最近更新 更多