我正在开发一个正在处理传入数据的应用程序,目前需要为每个传入数据点命中数据库。问题是双重的:
- 数据库加载速度跟不上
- 数据库对小于5%的查询返回结果
第一个想法是将关系数据库中的数据缓存到类似Redis的东西中,以提高查找速度。但是,所有常规缓存策略都依赖于这样一个事实:如果需要,您可以回到数据库并从那里获取数据。这在我的情况下是有问题的,因为95%的查询在数据库中没有任何东西,我没有任何东西存储在缓存中。我当然可以将空结果存储在缓存中,但这意味着95%(甚至更多,取决于数据的组成)的缓存存储将是垃圾。
最好的方法是实现一个没有任何丢失的缓存系统:来自数据库的所有内容始终存在于缓存中,因此如果它不在缓存中,那么它就不在数据库中。环顾四周,虽然我发现Redis的一致性似乎不够可靠,不能总是做出这样的假设——如果关键字不存在于Redis,我怎么能100%确定它不存在于数据库中(假设我们不在更新中)?这是一个强烈的要求,如果数据库中有一行关于传入的数据点,那么它需要被找到,不能只是错过。
我如何设计一个缓存系统,它将始终具有与关系数据库相同的数据,而不需要在数据库中查找数据?Redis可能不是最好的工具,但你会推荐什么呢?是否有一个模式或关键字,我应该查找,我还没有想到?
数据库中已经存在这样的缓存:共享缓冲区。因此,您所要做的就是将shared_buffers
设置得足够大,以包含整个数据库并重新启动。很快整个数据库将被缓存,读取将不会导致更多的I/O,并且会很快。
如果你不能缓存整个数据库,只要你只需要访问它的一部分,PostgreSQL将只缓存那些正在使用的8kb页面。
在我看来,添加另一个外部缓存系统永远不会比这更好。如果数据被修改,情况尤其如此:任何外部缓存系统都必须确保其数据不是陈旧的,这将带来额外的开销。