我目前正在设计基于redis的缓存(第一次使用redis)并需要一个建议。
要求:
- 需要在redis中缓存有限数量的业务实体。例如:产品,客户
- 每个实体都存储在关系数据库中的几个表中。例如:ProductsTableA,ProductsTableB,CustomersTableA,CustomersTableB,CustomersTableC,CommonTableA,CommonTableB
- 并非上述每个表都包含实体密钥。一个表可以存储多个实体的数据(例如,CommonTableA用于填充产品和客户实体)。
- 构建实体需要相当复杂的业务逻辑。
- 缓存是按需填充的(如果在redis中找不到 - >查询来自db - >运行业务逻辑 - >填充redis - >返回客户端)
- 数据主要是只读
- 一个小时/天的定期作业运行,使用从外部系统导入的数据填充/更新数据库(可能是大容量)。
醇>
任务:如何在将新数据集上传到db时进行有效的缓存逐出(参见上面的第7项)?
问题/并发症:由于业务逻辑/数据库架构的复杂性以及一次更新的数据量,我无法将每个更新/插入/删除的记录映射到缓存密钥并按键进行操作关键驱逐。
另一方面,刷新整个redis db也不是最佳的。
建议方法:如果至少有一个基础表中的数据发生变化,我选择单个实体类型作为“逐出单位”。例如,如果ProductsTableA中的一行或多行已更新,则应删除所有redis键,例如“product:XXX”。
问题:
- 有没有办法在Redis中为键/值对添加元数据/标签?在
我的情况我想用表名来标记缓存条目,以便稍后
可以批量过期与特定表相关的所有值。
- 如果回答1.是“否”我可以选择在redis中创建“元数据缓存”(使用列表?),其中key是表名,
值是与此表相关的实体键。但是,这需要一些机制来保持“主”和“元数据”缓存同步,所以我宁愿避免它。
- 有没有更好的方法来解决这个问题? :)
醇>
谢谢!