Caching 如何使用简单的写/删除方法为不同的用户组织Redis缓存

Caching 如何使用简单的写/删除方法为不同的用户组织Redis缓存,caching,redis,Caching,Redis,在一个应用程序中,我们在一个大的postgres数据集上运行一些复杂的查询。由于基础数据仅每月更新一次,因此我们根据用于计算的参数缓存结果(当前为postgres)。我们最终得到一个简单的键/值表: 键-表示计算参数的哈希JSON对象 值查询JSON结果 到目前为止,很简单——但是,每个客户都有这个表,在postgres中有自己的名称空间 客户上传缓存表中的新数据后,将在查询时删除并重新填充 为了在redis中实现这一点,我找到了不同的可能方法: 根据谷歌集团的评论,每个客户使用一个数据库,如果

在一个应用程序中,我们在一个大的postgres数据集上运行一些复杂的查询。由于基础数据仅每月更新一次,因此我们根据用于计算的参数缓存结果(当前为postgres)。我们最终得到一个简单的键/值表:

键-表示计算参数的哈希JSON对象 值查询JSON结果

到目前为止,很简单——但是,每个客户都有这个表,在postgres中有自己的名称空间

客户上传缓存表中的新数据后,将在查询时删除并重新填充

为了在redis中实现这一点,我找到了不同的可能方法:

  • 根据谷歌集团的评论,每个客户使用一个数据库,如果我们想启用LRU,甚至不启用LRU,最多可以使用1000个数据库。(目前1000个数据库绝对没有限制,只是感觉不太合适)
  • 每个客户使用一个哈希,并将其视为我们的键/值表。我不认为LRU能够从散列中删除使用最少的密钥,相反,它将为最不活跃的客户删除缓存,这可能是可以的,但我们可能不会为密钥使用建议的幂律访问模式,以便使用LRU
  • 将键命名为
    customer:params_hash
    ,当需要删除数据时,如果它们与模式
    customer:
    匹配,则扫描所有键。此处描述了必要的方法和脚本:
  • 当用户使用应用程序时,数据将持续写入,以改进他们对已执行的报告/查询的访问,并减少系统负载。底层数据平均每月更新一次(每两个月更新一次),缓存将被删除(基于postgres使用外部数据包装的触发器)


    这三个是唯一的选择吗?在redis中,哪一个最合适、最适合?解决方案3似乎是最好的(您将每月删除一次密钥)。但请记住,不建议在生产服务器上使用“keys”命令。我认为您不需要自动删除这些密钥,应该使用:

    另外,只需在production env中对新解决方案进行基准测试,因为我认为旧解决方案的主要瓶颈不是缓存引擎(postgresql、redis或memcached),而是网络和解码。()