Pull to refresh

IMemcacheClient: нереляционность как религия

Reading time2 min
Views933
Никакой проект не обходится без базы данных. Мы привыкли видеть в ней хранилище множества связанных объектов, с множеством условий. Это бесспорно очень удобно, но в силу разных обстоятельств, в нагруженной системе, чаще всего приходится прибегать к другим методам, т.к. кол-во выборок и транзакций ограничено современным железом, а запросто распределить на несколько серверов не получится. В ряде случаев можно использовать репликацию, но и это не паноцея на данный момент.

Нереляционное хранилище является распределенной системой ввода/вывода позволяющей хранить пары «ключ -> значение». Такие базы данных бывают двух типов: устойчивые и неустойчивые. Устойчивые (например, MemcacheDB, TDB, Hypertable) записывают данные на диск и используют транзакционную модель. Неустойчивые (например Memcached) — хранят ключи в памяти лишь некоторое время (и не заявляют сохранность).
Неустойчивые удобно использовать для кеширования и снижения нагрузки на устойчивые. Конечных реализаций очень много, но я выбрал Memcached и MemcacheDB. Вопреки первому впечатлению, Memcached может очень много, куда больше чем запись/чтение результата, для чего его и используют в большинстве случаев. Осознав это, я столкнулся с нехваткой готового инструментария, необходимого для эффективной промышленной разработки решений, использующих такие техники. Так родился IMemcacheClient (Improved Memcache Client), он позволяет забыть о реализации, и пользоваться интерфейсами.
Основные возможности и преимущества:
  • Возможность задания общего префикса для всех ключей (namespace).
  • Помимо основных возможностей (get/set/append/prepend/increment/decrement), модульная архитектура включает:
       1. Объект Lock — реализует mutex (взаимоисключение, блокировку).
          Чаще всего используется чтобы недопустить одновременное выполнение двух задач.

       2. Объект Entry — реализует хранилище ключа с возможностью тегирования.
          К сожалению, на данный момент тегирование реализовано не нативно, а посредством дополнительных ключей и именной инвалидации.

       3. Объект Queue — реализует распределенную очередь с поддержкой нескольких просмотров (multi-views).
          Группа процессов может одновременно писать в очередь, а другая группа — читать её. При этом гарантируется, что 1 сообщение не будет получено более одного раза в рамках одного Просмотра.

       4. Объект SharedInteger — реализует атомарный расшаренный Integer с поддержкой increment/decrement.
          Удобно использовать для счетчиков, анти-флуда.

       5. Объект SharedObject — реализует атомарный расшаренный объект.
          Можно эффективно хранить небольшие массивы, которые нечасто обновляются.

  • В дистрибутив включена реализация фреймворка MapReduce на основе модуля Queue. Примеры прилагаются.
  • Возможность использовать функционал как с Memcached, так и с MemcacheDB.

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

LGPL.
Web: code.google.com/p/imemcacheclient-php
Written by kak.serpom.po.yaitsam@gmail.com
Tags:
Hubs:
Total votes 6: ↑5 and ↓1+4
Comments3

Articles