caching - 我可以在 Redis 中以某种方式标记数据吗?
问题描述
我有一个对象Company
和多个方法可以用来获取这个对象。前任。GetById
, GetByEmail
, GetByName
. 我想要的是缓存这些方法调用,并有可能一次使与一个对象相关的所有缓存条目无效。
例如,缓存了一家公司。缓存中有 3 个条目,具有以下键:
Company:GetById:123
Company:GetByEmail:foo@bar.com
Company:GetByName:Acme
所有三个密钥都与一家公司相关。
现在让我们假设公司发生了变化。然后我想使与该公司相关的所有密钥无效。我没有找到任何用于此目的的内置解决方案。用一些常见的 id(例如companyId)标记缓存条目,然后通过它删除所有条目会很好,但这个功能似乎不存在。
解决方案
因此,要直接回答您的问题,您可能希望在列表中维护与您的公司相关的所有键,扫描该列表,并使用 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"
推荐阅读
- javascript - 如何检查一个对象属性是否也存在于另一个对象中?
- java - Android(Java)中的一叠卡片(类似纸牌)
- java - 从文件中读取的 java 代码应该读取完整的文件,但不会
- javascript - 为什么我的邮递员没有显示我的架构成立时间和收入?
- python - 如何将 DataFrame 与 if 条件进行比较?
- google-apps-script - 如何使用多个单元格作为电子邮件正文、Google 表格
- php - 当 MariaDB 查询超时时 PHP 不会抛出异常
- latex - RStudio Tabularx 表格未居中
- upgrade - TYPO3 : 扩展从版本 7 升级到 9
- python - 使用python检查zip文件中的任何文件夹