Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Оптимальное решение - models, hit-counter, cache, redis (order, sort) [RSS Feed]

#1 Апрель 15, 2013 23:31:03

ssv1
Зарегистрирован: 2012-12-22
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимальное решение - models, hit-counter, cache, redis (order, sort)

Добрый вечер коллеги,

Столкнулся с такой проблеммой, имеются устоявшиеся модели разнообразных категорий (новости, видео и тп), у каждой модели есть пустое поле hits (PositiveIntegerField), рассчитанное под hit-counter. Статистика просмотра страниц собирается в кеш, в роли которого выступает redis. Естественно никакой связи с моделями нет.

При сохранении ключём выступает ‘hits_%s’ % request.path ну и значением естественно количество просмотров.

======

Сегодня целый день ломаю голову над тем, как бы всё это поправить так, что бы была возможность выводить данные из модели и делать сортировку по количеству просмотров.


На текущий момент я придумал три возможных варианта решения:

1. Отказаться от redis и честно заполнять поля hits, тем самым упростив сортировку при выводе.
2. Использовать hash-таблицы и сохранять несколько значений текущих страниц (в разработке).
3. Использовать Django Managers и попробовтаь обернуть модель используя плавующее поле.

В процессе обмозговывания всех трёх вариантов, время от времени прихожу к тому, что все они бреовые и я делаю что-то не так. Иногда посещают мысли, что это вообще должен быть javascript.

Подскажите, может быть кто сталкивался с подобной проблемой. Хочется понять, какое должно быть оптимальное решение по вопросу hit-counter с учётом несложной проверки по _session_key и главное, с учётом будущего кэширования.

p.s.
Искренне надеюсь, что написал понятно

Отредактировано ssv1 (Апрель 15, 2013 23:41:05)

Офлайн

#2 Апрель 16, 2013 07:43:15

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Оптимальное решение - models, hit-counter, cache, redis (order, sort)

Офлайн

#3 Апрель 16, 2013 12:07:06

ssv1
Зарегистрирован: 2012-12-22
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимальное решение - models, hit-counter, cache, redis (order, sort)

Спасибо за ссылку, но я ещё позовчера посомтрел это решение и пришёл к выводу, что оно мне не подходит.
Тем более я хочу всё сделать сам, ибо ничего сложного там нет.

Сейчас основная проблема заключается в том, что я пока сам не придумал механизма по которому можно было бы сортировать вывод по количеству просмотров страниц с учётом того, что (как я писал выше) данные о количестве просмотров у меня хранятся в редисе и никак не связанны с моделями, а как вы понимаете основная сортировка данных происходит через orm objects.filter().order_by().

Задавая этот вопрос я надеялся получить ответ, каким наиболее популярными способами организовывают счётсчики на больших ресурсах и главное как (через менеджеры, модели, или ещё через что-то) осуществляют сортировку в независимости от того, есть ли кеширование моделей, вьюшек или темплейтов.

Ну если нет стандартного решения, сконструирую своё, не в первый раз

Спасибо.

Офлайн

#4 Апрель 16, 2013 18:36:26

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Оптимальное решение - models, hit-counter, cache, redis (order, sort)

А что если в редисе хранить sorted set на каждую модель, в котором будет:
key - имя модели
score - количество обращений
member - pk модели

Т.е., добавляем:

ZADD model 1 pk1
ZADD model 1 pk2

Потом при обращении:
ZINCRBY model 1 pk1

Когда нужно будет получить, допустим, 10 самых популярных:
ZREVRANGE model  0 9

А в ORM:
objects.filter(pk__in=(...))

Отредактировано reclosedev (Апрель 16, 2013 18:37:41)

Офлайн

#5 Апрель 16, 2013 18:56:44

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Оптимальное решение - models, hit-counter, cache, redis (order, sort)

Кстати, вот это не смотрели? https://github.com/Suor/django-counters

Мельком глянул, если туда добавить ZREVRANGE и методы для выбора нескольких объектов в порядке популярности, должно получится как раз то, что хотите.

Офлайн

#6 Апрель 17, 2013 00:36:11

ssv1
Зарегистрирован: 2012-12-22
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимальное решение - models, hit-counter, cache, redis (order, sort)

Спасибо за здравую мысль, я тут кое что напридумывал + возьму ваши идеи на заметку, завтра-послезавтра начну переделывать и обязательно напишу, что получилось.

Офлайн

  • Начало
  • » Django
  • » Оптимальное решение - models, hit-counter, cache, redis (order, sort)[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version