python - 自动 SQL 缓存
问题描述
我正在考虑将缓存添加到后端的策略。我可以缓存任何特定类型的查询,例如用于缓存 USER 查找的 memcached 示例:
sql = "SELECT * FROM user WHERE user_id = ?"
key = 'SQL:' . user_id . ':' . md5sum(sql)
但这将涉及在我的应用程序的各个地方添加代码。我看到有一些用于“自动”缓存的商业解决方案。但是是否有任何库或基本支持来分析正在执行的各种 SQL 语句并找出如何缓存它们?它可能不如手动调整的方法那么好,但在我走这条路之前,您是否推荐任何选项来提供更自动化的缓存策略,基于查看我的后端正在执行的任何查询的形式/频率/性能运行?
我的后端是 Python/AWS Chalice Lambda。所有的 SQL 查询都通过我自己的包装类。即使不做一些“智能”的事情,您是否会建议将所有缓存逻辑放在原始查询级别或分散到更接近应用程序逻辑的位置?
解决方案
在大多数情况下,您可以信任常见的缓存后端,例如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 而不是手动编写。
推荐阅读
- excel - VBA:提取脚注宏引用的句子
- php - Woocommerce - 在谢谢页面上再次添加订单
- c++ - GDI+ 文本绘制不一致
- android-studio - 为什么为 android studio 分配太多内存会导致性能下降
- node.js - NodeJS 下载速度比 chrome 慢。可以模拟浏览器吗?
- excel - Excel 2016 ActiveX 工作表控件 - 不再允许访问属性
- python - Pygame 去 x 位置然后 y 并返回 x 位置 n 次
- excel - 如何在空白行之间对单元格行进行分组
- perl - Perl 在文件中寻找偏移量的一行
- mysql - Nodejs:mysql流查询到CSV文件以及列名