Это хорошая идея использовать кеш и как использовать его для 4000-10000 строк данных в Django для одной страницы? - PullRequest
1 голос
/ 25 мая 2020

Django 2.2

Мне нужно получить 4000-10000 строк данных из конкретной таблицы данных (назовем это commonsites) среди других для отображения веб-страницы.

Я могу сузить до 3 полей из этих 4000-10000 строк (id, name, business_id)

Мой трафик c низкий. Но мне было интересно, стоит ли использовать кеширование для извлечения этих 4000-10000 строк

Данные для этих строк вряд ли изменятся. Но если они меняются или удаляются, как мне обновить / удалить отдельные строки в кеше, а не весь кеш?

Или это вообще хорошая идея?

Мои установки:

Обновление

Добавляя больше ясности, веб-страница является извлекаемой . Как только запрос страницы будет сделан, интерфейс javascript выполнит вызов API. Затем этот вызов API будет извлекать эти 4000-10000 строк данных из таблицы данных.

Итак, эти строки данных являются уже существующими данными.

Данные отправляются как данные API json в виде списка в json данных.

Для ясности, данные не будут разбиты на страницы. Это все будет отображаться. И я не измерял размер данных, поэтому не могу сказать, насколько они велики. Сомневаюсь, что больше 5мб.

1 Ответ

1 голос
/ 27 мая 2020

Поскольку мы задаем вопросы в комментариях, я могу дать исчерпывающий ответ.

Хранение ~ 4K-10K строк в одной строке может быть не очень хорошей практикой. Но вы не планируете нумерацию страниц на стороне интерфейса. Даже если вы уменьшите количество параметров до id, name, business_id - для такого количества строк это может быть неудобно по следующим причинам:

  • Вам нужно получить значение как целиком, что может вызвать проблемы с сетью. Особенно когда трафик c становится высоким, каждый человек будет извлекать этот фрагмент данных.
  • Если вы хотите обновить / удалить некоторые из строк, вам необходимо (получить + обновить + установить) / установить их как целое (снова сеть)
  • Вы не можете аннулировать некоторую часть значения.
  • Вы не можете установить частичный TTL - вы либо истекаете / сохраняете все.

Данные для этих строк вряд ли изменятся. Но если они меняются или удаляются, как мне обновить / удалить отдельные строки в кеше, а не весь кеш?

Поскольку вам не нужна разбивка на страницы и вы хотите сохранить их в одиночный ключ, вместо string вы можете использовать hash, чтобы удовлетворить условиям, перечисленным выше.

127.0.0.1:6379> hset row 1 "some-json"
(integer) 1
127.0.0.1:6379> hset row 2 "some-json2"
(integer) 1
127.0.0.1:6379> hset row 3 "some-json3"
(integer) 1
127.0.0.1:6379> hset row 4 "some-json4"
(integer) 1
127.0.0.1:6379> hgetall row
1) "1"
2) "some-json"
3) "2"
4) "some-json2"
5) "3"
6) "some-json3"
7) "4"
8) "some-json4"
127.0.0.1:6379> hset row 3 "some-other-json"
(integer) 0
127.0.0.1:6379> hgetall row
1) "1"
2) "some-json"
3) "2"
4) "some-json2"
5) "3"
6) "some-other-json"
7) "4"
8) "some-json4"
127.0.0.1:6379> hdel row 3
(integer) 1
127.0.0.1:6379> hgetall row
1) "1"
2) "some-json"
3) "2"
4) "some-json2"
5) "4"
6) "some-json4"
127.0.0.1:6379>

Вы можете использовать hset для одновременного обновления одной / нескольких строк. Вы можете удалить из кеша с помощью hdel отдельную строку. Вы по-прежнему можете получить все данные как единое целое, используя hgetall. Не существует частичного TTL для полей ha sh (в отсортированных наборах это есть с некоторым кодом на уровне приложения), но ha sh более подходит для ваших вариантов использования, чем строки.

...