首页 > 解决方案 > 自动 SQL 缓存

问题描述

我正在考虑将缓存添加到后端的策略。我可以缓存任何特定类型的查询,例如用于缓存 USER 查找的 memcached 示例:

sql = "SELECT * FROM user WHERE user_id = ?"
key = 'SQL:' . user_id . ':' . md5sum(sql)

但这将涉及在我的应用程序的各个地方添加代码。我看到有一些用于“自动”缓存的商业解决方案。但是是否有任何库或基本支持来分析正在执行的各种 SQL 语句并找出如何缓存它们?它可能不如手动调整的方法那么好,但在我走这条路之前,您是否推荐任何选项来提供更自动化的缓存策略,基于查看我的后端正在执行的任何查询的形式/频率/性能运行?

我的后端是 Python/AWS Chalice Lambda。所有的 SQL 查询都通过我自己的包装类。即使不做一些“智能”的事情,您是否会建议将所有缓存逻辑放在原始查询级别或分散到更接近应用程序逻辑的位置?

标签: pythonsqldatabasememcached

解决方案


在大多数情况下,您可以信任常见的缓存后端,例如memcached。他们正在实施 LRU 战略。因此,如果您尝试将所有内容都放入缓存中,它会自动将最近的查询保留在存储中。没有分析,但结果相似。

一种方法:

import ring
import pymemcache.client

# you must install and run memcached before do this
client = pymemcache.client.Client(('127.0.0.1', 11211))

@ring.memcache(client, expire=3600)  # maximum 3600 seconds
def run_sql(sql):
    result = ... # run your code here
    return result

run_sql("select * form A")  # run at first time
run_sql("select * form A")  # bring cache at second time (for 3600 seconds)

您不需要生成任何哈希键。

当您想手动删除缓存时:

run_sql.delete("select * from A")

有关详细信息,请参阅文档:https ://ring-cache.readthedocs.io/en/latest/quickstart.html

注意:不是您问题的答案,但如果您不使用任何 ORM,请考虑尝试任何 sql builder 而不是手动编写。


推荐阅读