17.06.2009 13:00

  1. Kane

    0 ↑
    0 ↓
    Возможна ли рассинхронизация при кешировании данных в json/pickle полях? И как этого избежать или вообще не использовать такое кеширование.
    Например если я хочу закешировать список просмотревших какой то объект в json поле (дополнительно к many-to-many таблице).

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

  3. Kane

    0 ↑
    0 ↓
    Прямо сейчас я имел в виду простейший вариант, например при просмотре объекта делать
    object.viewed_by[user.id] = True;

    Что то вроде этого. viewed_by - сериализованное поле. Т.е. никаких проверок на синхронизацию нет, просто в момент просмотра добавляется ключ. Значит в этом варианте вполне может произойти перезапись кеша? Как избежать перезаписи, или сделать совсем по другому?
  4. Imbolc

    0 ↑
    0 ↓
    Тоже не понял, при чём тут сериализация. Вроде, всё упирается в синхронизацию данных между таблицами. Какое имеет значение формат этих данных-то?

    В случае с viewed_by лучше сделать совсем подругому, конечно. Например, табличку вида (key, val), уникальную по этой паре. И туда добавлять всякие ('viewed_by', user_id).

    Ваш вариант с сериализацией можно оформить в таком виде: object.user_id['viewed_by'] = True. Так перезапись всяких флагов или не мега-точных счётчиков не роляет.
  5. Kane

    0 ↑
    0 ↓
    Таблица связи есть, кеширующее поле планировал только для того, чтобы показывать в списке объектов (иначе придется делать либо по запросу на строку либо +1 селект заранее и подготавливать массив во view). Подробнее, предположим есть
    Article
    User
    и связь Many To Many юзеров к статьям.
    У меня есть 2 варианта - сделать кеширующее поле, либо перед показом списка вытаскивать заранее все связи и сортировать во view. Чтобы при показе показывать всех юзеров относящихся к статье. Вопрос был не будет ли проблем с полем в наивной реализации. Т.е. поле это хеш, в момент действия туда заносится ключ user_id.

    object.user_id['viewed_by'] = True.

    Не понял как использовать вот это.
  6. Imbolc

    0 ↑
    0 ↓

    У меня есть 2 варианта - сделать кеширующее поле, либо перед показом списка вытаскивать заранее все связи и сортировать во view.

    А какой смысл в этих сложностях? select_related тяжело будет?

  7. Kane

    0 ↑
    0 ↓
    select_related не работает для many-to-many. в принципе подготовить данные во вьюхе нетрудно, просто чисто теоретически интересно будут ли проблемы с такой реализацией кеша (на будущее), чтобы знать что вообще не стоит думать об этом, либо узнать хороший способ как сделать.
  8. Imbolc

    0 ↑
    0 ↓

    Дык, это зависит от реализации синхронизации кэша, а не от места и способа хранения.

    Как будет происходить синхронизация (по времени или по факту изменения данных)? Если второй вариант, будет ли вообще смысл в кэше? Насколько часто будут меняться данные по отношению к просмотрам закэшированного?

    И имхо, лучше завязываться на стандартное кэширование Джанги, чем мудрить с полями:

    • проще его отключать/включать будет
    • если в файликах или памяти кэш, быстрее будет работать
    • в бэкапы бд не будет попадать лишний там кэш
    • и главное, можно сначала забить на это дело, вообще. Написать безо всякого кэша, а потом прикрутить по мере надобности. Может ещё алгоритмы поменяете пару раз и в конце концов кэш реализуется парой строчек в шаблоне :)

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.