У меня есть этот 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, которая будет запрашивать указанное выше утверждение, будут ли автоматически кэшироваться данные за последний час? потому что в моем случае, если есть новые данные, он обновит только строку за последний час.
Если нет как кешировать? заранее спасибо
@GordonLinoff в среднем 2,752 мс, что, если данные слишком велики, чтобы их можно было считать за каждый час?
Что, если в таблицу будут вставлены новые данные? что, если стоимость today изменится в мгновение ока?
2.752 мс - это действительно очень быстро.
PostgreSQL кэширует данные автоматически на основе алгоритма LRU (проверьте эту ссылку: madusudanan.com/blog/understanding-postgres-caching-in-depth). Здесь вы делаете преждевременную оптимизацию;)


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.
Почему вас беспокоит кеширование? Сколько времени требуется для выполнения запроса?