在应用程序中,我们在大型postgres数据集上运行一些复杂的查询。由于基础数据仅在每个月更新,因此我们根据用于计算的参数缓存结果(当前为postgres)。我们最终得到一个简单的键/值表:
key - 散列表示计算参数的JSON对象 value - 查询JSON结果
到目前为止,很容易 - 但是,这个表存在于每个客户,它们在postgres中有自己的命名空间。
客户上传后,缓存表中的新数据将被删除,并在查询时重新填充。
要在redis中执行此操作,我发现了不同的可能方法:
customer:params_hash
,并且当需要删除数据时,如果它们与模式customer:*
匹配,则扫描所有密钥。这里描述了必要的方法和脚本:How to atomically delete keys matching a pattern using Redis 在用户使用应用程序时,将持续写入数据,以便改进对已执行的报告/查询的访问,并减少系统负载。基础数据平均每月更新一次 - 每隔一个月更新一次,而缓存将被删除(基于使用外部数据包装器的postgres触发器)。
那3个是唯一的选择吗?哪一个是最合适的,并且是redis的方式?
答案 0 :(得分:1)
解决方案3似乎是最好的(您将每月删除一次键)。但请记住,使用"键"命令不建议在生产服务器上使用。我认为您不需要以原子方式删除这些密钥,并且应该使用:http://redis.io/commands/scan
此外,只需在生产环境中对新解决方案进行基准测试 - 因为我认为旧解决方案的主要瓶颈不是缓存引擎(postgresql,redis或memcached),而是网络和解码。 (http://kiss-web.blogspot.com/)。