Pull to refresh

Реализация noSQL на PHP

Reading time2 min
Views3.6K
Скорость, друзья, — вот одно из важных составляющих вашего проекта. Пока ресурс посещает 10-100 пользователей в день, то все нормально — пользователь радуется и приглашает к вам своих друзей, друзья своих друзей и так далее. Нагрузка растет…

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

Но со временем успешный проект всегда будет требовать большей производительности из-за увеличения посещаемости проекта.

Рассмотрим связку PHP+MySQL+Memcached.

Чтобы показать пользователю статью с комментариями, нужно:
  1. Посмотреть есть ли статья (с комментариями) в кэше
  2. Если нет, то сделать «дорогой» JOIN текста + комментариев
  3. Положить все в кэш
  4. Отдать контент пользователю
Большой минус в этом алгоритме — это мускульный JOIN (или любой другой СУБД).
Современная концепция noSQL появилась, как ответ нормализованным структурам данных.

Рассмотрим связку PHP+Memcached в предыдущем примере:
  1. Посмотреть есть ли статья (с комментариями) в кэше
  2. Если нет, то положить ее в кэш
  3. Отдать контент пользователю
На один пункт стало «легче». Нет JOIN, но где брать данные? Хранить в файлах.

Появляется понятие «документ» (например: статья с комментариями). Чтобы конкретнее разобраться в noSQL технологии, захотелось как всегда «придумать велосипед».

Прототип JIM2

Требуются: Apache + mod_php + php_xcache

Указываем путь, где будут храниться файлы:
define('STORAGE_PATH', 'F:\\tmp\\jim2');

Пример использования:

запись
$collection = new Collection();

$vasya = array
(
 'name' => 'Vasya',
 'sex' => 'male'
);

$masha = array
(
 'name' => 'Masha',
 'sex' => 'female'
);

$jim = array
(
 'name' => 'Jim',
 'sex' => 'male',
 'type' => 'dog'
);

$collection->put($vasya);
$collection->put($masha);
$collection->put($jim);

$collection->createIndex( array ('name+sex', 'sex') );

чтение
$collection = new Collection();

$keys = xcache_get('./index/sex/male');

foreach ($keys as $key)
{
 print_r( $collection->get($key) );
}
Особенности:
  1. Документы хранятся в виде ключ/значение
  2. По свойствам документа можно строить индексы (создаются дополнительные ключи)
  3. У каждого документа есть поле _rev, указывающее на версию документа. Это позволит избежать коллизии при блокировке файла на запись, так как проверяются версии документов
  4. Также сама коллекция хранит версию. Сделано для того, чтобы можно было преверять актуальность кэшей, построенных на базе коллекции документов
Чего еще нет, но будет:
  1. Выборка коллекции с помощью API
  2. Pagination
  3. … любое ваше предложение
P.S. Скорость на чтение я не сравнивал, так как очевидно, что прямое обращение к кэшу будет работать всегда быстро. А вот скорость вставки (100 элементов) порадовала: связка MySQL+memcached отстала (0.5417142) от JIM2 (0.4791223)
Tags:
Hubs:
-7
Comments37

Articles