Как я могу улучшить производительность своего сайта социальной сети, используя memcached? - PullRequest
5 голосов
/ 25 июля 2009

Я бы хотел использовать memcached на своем сайте в социальной сети. Будучи социальной сетью, большинство данных меняется очень часто.

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

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

Я мог видеть, возможно, кэширование некоторой информации профиля, которая изменяется только, когда пользователь обновляет свой профиль, но это создаст запись кэша для каждого пользователя, если естьболее 100 000 пользователей, которые много кешируютЭто хорошая идея?

1 Ответ

2 голосов
/ 27 июля 2009

Я бы сказал, что это хорошая идея, чтобы кэшировать, где это возможно .... в большинстве случаев вы сможете извлекать элементы из memcached (особенно если у вас сложные объединения и тому подобное) быстрее, чем традиционная RDBMS. В настоящее время я использую такую ​​стратегию с большим успехом, и вот что я узнал из опыта:

  1. , если это возможно, кэшировать неограниченное время и записывать новое значение при внесении изменений. старайтесь не выполнять явное удаление, так как вы можете вызвать состояние состязания с несколькими одновременными обращениями к данным, пытаясь обновить кэш. также реализуйте блокировку, если элемент не существует в кэше, чтобы предотвратить вышеуказанную проблему (используя memcached «add» + короткое время ожидания в цикле)

  2. обновить кэш в фоновом режиме, если это возможно, используя очередь. Моя реализация в настоящее время использует многопоточные процессы Perl, работающие в background + beanstalkd, таким образом предотвращая задержку времени на веб-интерфейсе. большинство изменений во времени может привести к небольшому лагу.

  3. по возможности использовать memcached getmulti, многие отдельные вызовы memcached действительно суммируются.

  4. уровеньВаш кеш при проверке элемента сначала проверяет локальный массив, затем memcached, затем db. кешировать результат в локальном массиве после первого доступа, чтобы предотвратить многократное попадание в memcached при выполнении скрипта для одного и того же элемента. РЕДАКТИРОВАТЬ: уточнить, если при использовании языка сценариев, такого как PHP, локальный массив будет жить только до тех пор, пока выполняется текущее выполнение сценария :) пример:

    class Itemcache {
        private $cached_items = array();
        private $memcachedobj;
    
        public function getitem($memcache_key){
            if(isset($this->cached_items[$memcache_key])){
                return $this->cached_items[$memcache_key];
            }elseif($result = $this->memcachedobj->get($memcache_key)){
                $this->cached_items[$memcache_key] = $result;
                return $result;
            }else{
                // db query here as $dbresult
                $this->memcachedobj->set($memcache_key,$dbresult,0);
                $this->cached_items[$memcache_key] = $dbresult;
                return $dbresult;
        }
    }
    
  5. написать оболочкуфункция, которая реализует вышеупомянутую стратегию кэширования # 4.

  6. использует согласованную структуру ключей в memcached, например. 'userinfo_ {user.pk}' где user.pk - это первичный ключ пользователя в rdbms.

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

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