Gibson Cache Server

в 18:10, , рубрики: nosql, redis, метки: ,

imageВ своей работе мне часто приходится использовать key-value хранилище для организации связи между процессами, хранения настроек системы, временных данных и т. д. Для данных целей я использую Redis. Меня он вполне устраивает, еще и hiredis всем библиотекам библиотека.
Буквально сегодня наткнулся на совсем новый проект — Gibson Cache Server. Первый коммит датирован 17 маем 2013 года. О чем и речь!

Gibson Cache Server — in-memory key-value база данных, в основе которой лежит структура данных — дерево, в то время как redis и memcached используют хеш-таблицу. Это позволяет использовать операции сразу над несколькими ключами.

Особенности, заявленные разработчиком:

  • Чрезвычайно быстрая
  • Используется настолько мало памяти, насколько это возможно
  • Поддерживает LZF сжатие
  • Поддерживает Time-To-Live (время жизни ключа)
  • Поддерживает функциональность для блокировки и разблокировки ключей
  • Ну и собственно самое главное — множественные операции

Установка

Сервер

Здесь ничего сложного нет. Исходники сервера можно взять здесь.

git clone https://github.com/evilsocket/gibson.git
cd gibson
сmake -G «Unix Makefiles» .
make
sudo make install

Конфигурационный файл находится в /etc/gibson/gibson.conf
К слову, сервер можно запускать с ключем -c, указывая путь к файлу конфигурации, и не устанавливать всё в системные директории.

Клиент

Исходники находятся тут.
Здесь всё аналогично. Единственное, что нужно отметить, в ./src/linenoise должны лежать исходники библиотеки linenoise.
После

git clone https://github.com/evilsocket/libgibsonclient
cd libgibsonclient
сmake -G «Unix Makefiles» .
make

У нас появляется «джентельменский набор»: заголовчный файл, сама библиотека и gibson-cli.

Демонстрация

Запуск клиента и список команд, которые доступны на данный момент.

Скрытый текст

deck@crunch ~/work/libgibsonclient $ ./gibson-cli -u /tmp/gibson.sock 

type :help or :h for a list of commands, :quit or :q to quit.

local> :h
	SET <ttl> <key> <value>
	TLL <key> <ttl>
	GET <key>
	DEL <key>
	INC <key>
	DEC <key>
	LOCK <key> <seconds>
	UNLOCK <key>
	MSET <prefix> <value>
	MTTL <prefix> <ttl>
	MGET <prefix>
	MDEL <prefix>
	MINC <prefix>
	MDEC <prefix>
	MLOCK <prefix> <seconds>
	MUNLOCK <prefix>
	COUNT <prefix>
	STATS
	PING
	SIZEOF <key>
	MSIZEOF <prefix>
	ENCOF <key>

Стандартные set/get

Скрытый текст

local> set 0 foo 5
<STRING> 5
local> get foo
<STRING> 5

И с использованием TTL.

Скрытый текст

local> set 3 bar hi!
<STRING> hi!
local> get bar
<STRING> hi!
local> get bar
<REPL_ERR_NOT_FOUND>

Ну и множественные get/set

Скрытый текст

local> set 0 score:user1  400
<STRING> 400
local> set 0 score:user2  100
<STRING> 100
local> set 0 score:user3  900
<STRING> 900
local> mget score
score:user1 => <STRING> 400
score:user2 => <STRING> 100
score:user3 => <STRING> 900
local> mset score 0
<NUMBER> 3
local> mget score
score:user1 => <STRING> 0
score:user2 => <STRING> 0
score:user3 => <STRING> 0

Производительность

На сайте разработчика присутствуют данные тестов, которые он провел над операциями get/set на машине
Intel® Core(TM) i3-2130 CPU @ 3.40GHz with 8GB of RAM, с Debian Squeeze.
Сравнивал он свою базу данных с Redis. Результаты следующие:
Redis

Скрытый текст

$ redis-benchmark -c 1 -n 100000 -q -t SET
SET: 51519.84 requests per second

$ redis-benchmark -c 1 -n 100000 -q -t GET
GET: 49212.60 requests per second

Gibson

Скрытый текст

@ Created 100000 / 100000 in 1216ms
-- 82236.842105 Req/s

@ Verified : 100000 / 100000 in 1145ms

-- 87336.244541 Req/s

Если не лукавит, то производительность на этих операциях выше у Gibson на 60 процентов.

Заключение

В настоящее время уже есть библиотека для php. Также, обещают в скором времени добавить поддержку Nodejs.
Библиотека не может быть не сырой, но, несомненно, заслуживает внимания. Под мои задачи должна вписаться идеально. Посмотрим, что получится.

Автор: dck

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js