Найти - Пользователи
Полная версия: Оптимальное решение - models, hit-counter, cache, redis (order, sort)
Начало » Django » Оптимальное решение - models, hit-counter, cache, redis (order, sort)
1
ssv1
Добрый вечер коллеги,

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

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

======

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


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

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

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

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

p.s.
Искренне надеюсь, что написал понятно
Singularity
https://github.com/thornomad/django-hitcount
ssv1
Спасибо за ссылку, но я ещё позовчера посомтрел это решение и пришёл к выводу, что оно мне не подходит.
Тем более я хочу всё сделать сам, ибо ничего сложного там нет.

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

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

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

Спасибо.
reclosedev
А что если в редисе хранить 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
Кстати, вот это не смотрели? https://github.com/Suor/django-counters

Мельком глянул, если туда добавить ZREVRANGE и методы для выбора нескольких объектов в порядке популярности, должно получится как раз то, что хотите.
ssv1
Спасибо за здравую мысль, я тут кое что напридумывал + возьму ваши идеи на заметку, завтра-послезавтра начну переделывать и обязательно напишу, что получилось.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB