如何为具有许多不同查询变量的 Python 网络应用构建数据库缓存 (memcached/Redis)?

How do I structure a database cache (memcached/Redis) for a Python web app with many different variables for querying?

对于我的应用程序,我使用的是 Flask,但是我问的问题更笼统,可以应用于任何 Python 网络框架。

我正在建立一个比较网站,我可以在其中更新数据库中有关产品的详细信息。我想构建我的应用程序,以便访问我网站的 99% 的用户永远不需要查询数据库,而是从缓存(memcached 或 Redis)中检索信息。

我要求我的应用程序是实时的,因此我对数据库所做的任何更新都必须立即可供网站的任何访问者使用。因此我不想缓存 views/routes/html.

我想缓存整个数据库。但是,因为在查询时有太多不同的变量,我不确定如何构建它。例如,如果我要缓存每个查询,然后需要更新数据库中的产品,我基本上需要刷新整个缓存,这对于大型 Web 应用程序来说并不理想。

我更喜欢在数据库中缓存单独的行。问题是,我如何构建它以便在对数据库进行更新时适当地刷新缓存?另外,如何从缓存中将所有这些映射到一起?

我希望这是有道理的。

不过,我自己有一个 PHP 项目也有这个确切的问题。我的解决方案是使用 ElasticSearch 作为应用程序和数据库之间的中间缓存。

关键在于 ORM。我设计它以便在调用 Entity.save() 时首先将其存储在数据库中,然后将完整的对象(包含所有引用)推送到 ElasticSearch,然后才提交事务并将流程返回到来电者。

通过这种方式,我保持了关系数据库的全部功能(原子更改、事务、约束、触发器等),并且仍然缓存了所有实体及其所有引用(父子关系)以及使无效的能力单个缓存对象。

希望对您有所帮助。

Josiah Carlson 的一本名为 "Redis in Action" 的免费电子书回答了我所有的问题。它很长,但通读之后,我对如何构建缓存架构有了相当扎实的理解。它给出了真实世界的例子,例如社交网络和拥有大量流量的购物网站。我需要再通读一遍或两遍才能完全理解。一本好书!

Link: Redis in Action