Запрос PostgreSQL и кеширование данных

У меня есть этот SQL-запрос:

SELECT p.timestamp,
      COUNT(*) as total,
      date_part('hour', p.timestamp) as hour
      FROM parties as p
      WHERE p.timestamp >= TIMESTAMP 'today' AND p.timestamp < TIMESTAMP 'tomorrow'
      AND p.member_id = 1
      GROUP BY p.timestamp, hour;

который будет сгруппирован, сколько людей по часам:

+-------------------------+-------+------+
|        Timestamp        | Total | Hour |
+-------------------------+-------+------+
| 2018-11-21 12:00:00+07  |    10 |   12 |
| 2018-11-21 13:00:00+07  |     2 |   13 |
| 2018-11-21 14:00:00+07  |     2 |   14 |
| 2018-11-21 16:00:00+07  |     1 |   16 |
| 2018-11-21 17:00:00+07  |    21 |   17 |
| 2018-11-21 19:00:00+07  |    18 |   19 |
| 2018-11-21 20:00:00+07  |     8 |   20 |
| 2018-11-21 21:00:00+07  |     1 |   21 |
+-------------------------+-------+------+

Мой вопрос: если я обновлю некоторую конечную точку API, которая будет запрашивать указанное выше утверждение, будут ли автоматически кэшироваться данные за последний час? потому что в моем случае, если есть новые данные, он обновит только строку за последний час.

Если нет как кешировать? заранее спасибо

Почему вас беспокоит кеширование? Сколько времени требуется для выполнения запроса?

Gordon Linoff 21.11.2018 13:02

@GordonLinoff в среднем 2,752 мс, что, если данные слишком велики, чтобы их можно было считать за каждый час?

Kris MP 21.11.2018 13:04

Что, если в таблицу будут вставлены новые данные? что, если стоимость today изменится в мгновение ока?

wildplasser 21.11.2018 13:05

2.752 мс - это действительно очень быстро.

Gordon Linoff 21.11.2018 13:42

PostgreSQL кэширует данные автоматически на основе алгоритма LRU (проверьте эту ссылку: madusudanan.com/blog/understanding-postgres-caching-in-depth‌). Здесь вы делаете преждевременную оптимизацию;)

JustMe 21.11.2018 13:44
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
5
3 908
1

Ответы 1

PSQL не может кэшировать результат самого запроса. Решением является кеширование результата на уровне приложения API. Я предпочитаю использовать Redis для его кеширования. Использование hash с fields - это year+month+day+hour, а value - это общее количество онлайн-пользователей каждого часа. Пример:

 hash: useronline
 field: 2018112112 - value: 10
 field: 2018112113 - value: 2

Вы также устанавливаете тайм-аут для клавиши. По истечении таймаута ключ будет автоматически удален. Я поставлю здесь 1 час.

EXPIRE useronline 3600

Когда будет запрос API, мы сначала получим результат в кеш-памяти Redis. Если их не существует или истек срок действия запроса к уровню базы данных, чтобы получить результат, снова сохраните в кеш Redis. Ответить клиенту на результат. Вот список подходящих для языка программирования клиенты Redis.

Другие вопросы по теме