Автоматическое кеширование SQL - PullRequest
0 голосов
/ 12 октября 2018

Я рассматриваю свою стратегию добавления кэширования в бэкэнд.Я могу кэшировать любой конкретный тип запроса, например, в примере memcached для кэширования поиска USER:

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

Но это потребует добавления кода в разных местах по всему моему приложению.Я вижу, что есть некоторые коммерческие решения для "автоматизированного" кэширования.Но есть ли какая-либо библиотека или базовая поддержка для анализа различных выполняемых операторов SQL и выяснения, как их кэшировать?Возможно, он не так хорош, как подход, настроенный вручную, но прежде чем я пойду по этому пути, есть ли какой-либо вариант, который вы порекомендуете для обеспечения более автоматизированной стратегии кэширования, основанной на рассмотрении формы / частоты / производительности любых запросов, выполняемых моим бэкэндом, так как онработает?

Мой бэкэнд - Python / AWS Chalice Lambda.Все SQL-запросы проходят через мой собственный класс-оболочку.Даже если вы не сделаете что-то «умное», вы бы порекомендовали поместить всю логику кэширования на уровне необработанных запросов или распространить ее ближе к логике приложения?

1 Ответ

0 голосов
/ 15 октября 2018

В большинстве случаев вы просто можете доверять общим кэш-системам, таким как 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 вместо написания вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...