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

时间:2016-01-31 14:48:08

标签: caching redis

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

key - 散列表示计算参数的JSON对象 value - 查询JSON结果

到目前为止,很容易 - 但是,这个表存在于每个客户,它们在postgres中有自己的命名空间。

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

要在redis中执行此操作,我发现了不同的可能方法:

  1. 根据谷歌群组的评论,每个客户使用一个数据库,如果我们想要启用LRU,甚至超过它,那么这应该可以达到~1000个数据库。 (1000个数据库现在绝对不是限制性的,它只是感觉不是正确的方法)
  2. 为每个客户使用一个哈希值并将其视为我们的键/值表。我不认为LRU能够从哈希中删除最少使用的密钥,而是会删除最不活跃客户的缓存,这可能没问题,但可能我们不会有密钥的powerlaw访问模式,建议使用LRU
  3. 将密钥命名为customer:params_hash,并且当需要删除数据时,如果它们与模式customer:*匹配,则扫描所有密钥。这里描述了必要的方法和脚本:How to atomically delete keys matching a pattern using Redis
  4. 在用户使用应用程序时,将持续写入数据,以便改进对已执行的报告/查询的访问,并减少系统负载。基础数据平均每月更新一次 - 每隔一个月更新一次,而缓存将被删除(基于使用外部数据包装器的postgres触发器)。

    那3个是唯一的选择吗?哪一个是最合适的,并且是redis的方式?

1 个答案:

答案 0 :(得分:1)

解决方案3似乎是最好的(您将每月删除一次键)。但请记住,使用"键"命令不建议在生产服务器上使用。我认为您不需要以原子方式删除这些密钥,并且应该使用:http://redis.io/commands/scan

此外,只需在生产环境中对新解决方案进行基准测试 - 因为我认为旧解决方案的主要瓶颈不是缓存引擎(postgresql,redis或memcached),而是网络和解码。 (http://kiss-web.blogspot.com/)。