在Redis

时间:2016-03-23 04:09:45

标签: caching redis

我目前正在设计基于redis的缓存(第一次使用redis)并需要一个建议。

要求:

  1. 需要在redis中缓存有限数量的业务实体。例如:产品,客户
  2. 每个实体都存储在关系数据库中的几个表中。例如:ProductsTableA,ProductsTableB,CustomersTableA,CustomersTableB,CustomersTableC,CommonTableA,CommonTableB
  3. 并非上述每个表都包含实体密钥。一个表可以存储多个实体的数据(例如,CommonTableA用于填充产品和客户实体)。
  4. 构建实体需要相当复杂的业务逻辑。
  5. 缓存是按需填充的(如果在redis中找不到 - >查询来自db - >运行业务逻辑 - >填充redis - >返回客户端)
  6. 数据主要是只读
  7. 一个小时/天的定期作业运行,使用从外部系统导入的数据填充/更新数据库(可能是大容量)。
  8. 任务:如何在将新数据集上传到db时进行有效的缓存逐出(参见上面的第7项)?

    问题/并发症:由于业务逻辑/数据库架构的复杂性以及一次更新的数据量,我无法将每个更新/插入/删除的记录映射到缓存密钥并按键进行操作关键驱逐。 另一方面,刷新整个redis db也不是最佳的。

    建议方法:如果至少有一个基础表中的数据发生变化,我选择单个实体类型作为“逐出单位”。例如,如果ProductsTableA中的一行或多行已更新,则应删除所有redis键,例如“product:XXX”。

    问题:

    1. 有没有办法在Redis中为键/值对添加元数据/标签?在 我的情况我想用表名来标记缓存条目,以便稍后 可以批量过期与特定表相关的所有值。
    2. 如果回答1.是“否”我可以选择在redis中创建“元数据缓存”(使用列表?),其中key是表名, 值是与此表相关的实体键。但是,这需要一些机制来保持“主”和“元数据”缓存同步,所以我宁愿避免它。
    3. 有没有更好的方法来解决这个问题? :)
    4. 谢谢!

0 个答案:

没有答案