Лучшее место для сохранения количества просмотров для кэшированного объекта в PHP? - PullRequest
2 голосов
/ 15 декабря 2010

Мое приложение кэширует страницы, поэтому ненужные запросы к базе данных не выполняются. Они кэшируются как файлы в файловой системе с соответствующими именами (их уникальные идентификаторы).

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

Я не уверен, что это хорошая идея, и, как я заметил, доступ к memcached замедляет его. Есть ли лучшие решения?

Редактировать: Я не кеширую маленькие байты данных, я кеширую HTML-страницы и многие из них. На каждого пользователя приходится около 30 страниц, а при миллионе пользователей объем данных, требующих кэширования, будет огромным.

Ответы [ 3 ]

1 голос
/ 15 декабря 2010

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

На мой взгляд, обновление кеша в режиме реального времени сводит на нет смысл кеширования. Вам лучше писать базу данных в режиме реального времени и читать из кеша. Вам просто нужно своевременно обновлять кэш, чтобы поддерживать внешний вид интерфейса как можно более свежим (это последнее утверждение весьма относительное).

1 голос
/ 15 декабря 2010

Я не уверен, что это хорошая идея, и как я заметил, что доступ memcached замедляет его. Есть ли лучшие решения?

прирастить / ОВЦС

Я не понимаю? У них есть incr / decr команды в memcached специально для этого, который должен быть молниеносным.

Я посмотрел некоторые тесты :

[patg@vidya perl]$ ./memtest.pl -l 1000
Operation  Cache::Memcached libmemcached   C::M/libmem %  libmem/C::M % 
set        0.083264         0.061046       136.40         73.32         
get        0.164471         0.054142       303.78         32.92         
replace    0.081321         0.060575       134.25         74.49         
increment  0.080247         0.056108       143.02         69.92         
decrement  0.07893          0.052921       149.15         67.05         
delete     0.07416          0.056302       131.72         75.92         
total      0.562456         0.341165       164.86         60.66         
[patg@vidya perl]$ ./memtest.pl -l 10000
Operation  Cache::Memcached libmemcached   C::M/libmem %  libmem/C::M % 
set        0.838437         0.63161        132.75         75.33         
get        1.676396         0.552247       303.56         32.94         
replace    0.846411         0.615959       137.41         72.77         
increment  0.812054         0.538519       150.79         66.32         
decrement  0.787005         0.532655       147.75         67.68         
delete     0.744186         0.515013       144.50         69.20         
total      5.7046           3.386127       168.47         59.36         
[patg@vidya perl]$ ./memtest.pl -l 100000
Operation  Cache::Memcached libmemcached   C::M/libmem %  libmem/C::M % 
set        8.436679         6.469707       130.40         76.69         
get        16.641089        5.553091       299.67         33.37         
replace    8.438474         6.239129       135.25         73.94         
increment  8.110361         5.765341       140.67         71.09         
decrement  8.272824         5.615784       147.31         67.88         
delete     7.648199         5.32153        143.72         69.58         
total      57.547827        34.964783      164.59         60.76

Соперничество

Вы также используете mysql? Может быть, у вас есть утверждение на MySQL, поэтому медленно? потому что incr / decr должен быть быстрым?

1 голос
/ 15 декабря 2010

Я бы настроил cronjob для ночного запуска, который анализирует файл журнала доступа и обновляет счетчики. Я не уверен насчет метода memcache (не пробовал), но если вы прибегаете к обновлению базы данных при каждом отдельном запросе, я не думаю, что он будет очень эффективным. Запросы на обновление являются дорогостоящими, и обновление столбца count будет включать как минимум блокировку строки.

В качестве альтернативы, вы можете вставить запись в таблицу «views» для каждого представления, затем запустить ночной cronjob для агрегирования количества просмотров, добавить ее в столбец «views» в таблице страниц и затем очистить записи агрегированный.

Кроме того, всегда есть Google Analytics, если вы согласны обратиться к третьему лицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...