Форум сайта python.su
Добрый вечер коллеги,
Столкнулся с такой проблеммой, имеются устоявшиеся модели разнообразных категорий (новости, видео и тп), у каждой модели есть пустое поле 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)
Офлайн
Офлайн
Спасибо за ссылку, но я ещё позовчера посомтрел это решение и пришёл к выводу, что оно мне не подходит.
Тем более я хочу всё сделать сам, ибо ничего сложного там нет.
Сейчас основная проблема заключается в том, что я пока сам не придумал механизма по которому можно было бы сортировать вывод по количеству просмотров страниц с учётом того, что (как я писал выше) данные о количестве просмотров у меня хранятся в редисе и никак не связанны с моделями, а как вы понимаете основная сортировка данных происходит через orm objects.filter().order_by().
Задавая этот вопрос я надеялся получить ответ, каким наиболее популярными способами организовывают счётсчики на больших ресурсах и главное как (через менеджеры, модели, или ещё через что-то) осуществляют сортировку в независимости от того, есть ли кеширование моделей, вьюшек или темплейтов.
Ну если нет стандартного решения, сконструирую своё, не в первый раз
Спасибо.
Офлайн
А что если в редисе хранить sorted set на каждую модель, в котором будет:
key - имя модели
score - количество обращений
member - pk модели
Т.е., добавляем:
ZADD model 1 pk1
ZADD model 1 pk2
ZINCRBY model 1 pk1
ZREVRANGE model 0 9
objects.filter(pk__in=(...))
Отредактировано reclosedev (Апрель 16, 2013 18:37:41)
Офлайн
Кстати, вот это не смотрели? https://github.com/Suor/django-counters
Мельком глянул, если туда добавить ZREVRANGE и методы для выбора нескольких объектов в порядке популярности, должно получится как раз то, что хотите.
Офлайн
Спасибо за здравую мысль, я тут кое что напридумывал + возьму ваши идеи на заметку, завтра-послезавтра начну переделывать и обязательно напишу, что получилось.
Офлайн