Cachelot.io
Последнее изменение этой страницы: 17:28, 12 июня 2019.
![]() | |
Создатели: | Iurii (Yuriy) Krasnoshchok |
---|---|
Разработчики: | Iurii (Yuriy) Krasnoshchok |
Выпущена: | 4 April 2015 |
Написана на: | C++ |
Операционная система: | Alpine Linux, CentOS, Ubuntu Trusty, macOS, FreeBSD |
Локализация: | Английский |
Лицензия: | BSD лицензия |
Веб-сайт |
cachelot |
Cachelot — библиотека, работающая с фиксированным количеством предварительно выделенной памяти. Разработана Юрием Краснощеком, выпущена в 2015 году. Основная функциональность библиотеки - это работа с кэшем в пределах фиксированного объема памяти. Память выделяется один раз при инициализации, и потом только используется снова.
Библиотека используется тогда, когда приложению требуется быстрое LRU кэширование. Способна утилизировать до 98% выделенной памяти. То есть всего 2% памяти будет использовано на выравнивание и метаданные аллокатора. Помимо этого этого Cashelot обеспечивает плавное выполнение для операций чтения и записи. Также может исполнять роль согласованного кэша, возвращая ошибку при нехватке памяти или освобождать пространство от старых элементов для новых.
Код библиотеки написан на языке C++ Можно использовать библиотеку, либо сервер Cachelot как на портативных IoT устройствах, так и на мощных серверах с огромным количеством оперативной памяти.
Библиотека Cachelot предоставляет интерфейс на языке C, и теоретически может использоваться практически в любом языке программирования (при наличии "прослойки"): Python, Go!, JavaScript в Node.js, .NET, ColdFusion, Erlang, Java, Lisp, Lua, OCaml, Perl, PHP, Ruby. Библиотека может работать в режиме кэширования: выбрасывать старые элементы, если выделенная память закончилась при добавлении новых, либо в режиме консистентного хранилища - возвращать ошибку в подобной ситуации. Функциональность Cachelot копирует Memcached, поддерживая все его операции: add, get, set, append, prepend, cas, del.
Сервер Cachelot написан на С++ с использованием Boost asio, и совместим с Memcached по текстовому протоколу; может выступать прямой заменой Memcached.[Источник 1].
Содержание
Cashelot как распределенный кэш-сервер
Часто встает задача выбора ПО для кэшерования данных. Не задумываясь, можно выбрать Memcached, но не стоит забывать о Cashelot, который намного лучше использует оперативную память, из-за чего появляется возможность хранения большего количества элементов при том же объеме памяти. Также он быстрее с точки зрения задержки, что показывают тесты на веб-сайте разработчика [Источник 2].
Cashelot однопоточен, может масштабироваться до 1024 ядер и работать на устройствах с батарейным питанием. Поддерживает сокеты TCP, UPD и UNIX.
Особенности реализации
Высокая скорость работы Cachelot достигается за счет использования структур данных и алгоритмов, оптимизированных для работы с кэшами современных процессоров. Основное хранилище данных в Cachelot - хэш таблица реализует алгоритм Robin Hood Hashing [Источник 3].
Cachelot использует свой собственный менеджер памяти, который разбивает всю доступную память на "куски", размер которых является степенью двойки: 256, 512, 1024, 2048 ... <page_size> байт. Дополнительно, каждый из "кусков" разбит на "блоки" числом N (N - тоже степень двойки), так что при N=32 размеры блоков выглядят как: 256, 264, 272, 280, 288, 296 ... 512, 528, 544, ... allocation_limit. Например, когда пользователь запрашивает 260 байт памяти, аллокатор выбирает ближайший блок - 264 байта. Если свободных блоков размером 264 байт нет в наличии, то аллокатор будет пробовать разбить блок большего размера, или объединить соседние блоки меньшего размера. Использование степеней двойки в качестве размеров блоков помогает заменить дорогую для процессора операцию деления битовым сдвигом. Фиксированный размер блоков помогает бороться с фрагментацией памяти - блоки меньшего размера объединяются в блоки большего размера без остатка.
Единицей LRU в Cachelot является "страница" памяти - настраиваемый параметр (по умолчанию 1Mb). Каждый раз, когда вся доступная память использована, а пользователь пытается добавить новый элемент, Cachelot может "вытеснить" страницу, чтобы освободить память для нового элемента. При этом, все элементы, аллоцированные внутри этой страницы будут потеряны. Алгоритм LRU вытеснения Cachelot неточный - он может потерять только что добавленный элемент, если ему (элементу) не повезло, и он оказался в редко используемой странице, но зато алгоритм имеет амортизированную константную сложность O(1). Если выбрать маленький размер страницы, то это повысит качество работы LRU. При этом нужно учитывать что в Cachelot нельзя добавить элемент больше, чем размер одной страницы. Т.е. если планируется использовать Cachelot для объектов размером 2Mb, то размер страницы должен быть минимум 2Mb, или 4Mb с запасом [Источник 4].
Установка
Для установки можно пользоваться Docker, например:
docker run - - net = host cachelot/cachelot
Или при помощи консоли:
1. Клонируем исходный код Cashelot:
$ git clone https://github.com/cachelot/cachelot.git
2. Переходим в рабочий каталог cachelot:
$ cd cachelot
3. Создаем файлы для среды IDE или Makefile, выполнив команду в корневом каталоге Cashelot
$ cmake-G"{target}"
Например:
$ cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release && make
Источники
- ↑ Cachelot.io vs. Memcached vs. Redis [Электронный ресурс] : Материал из https://db-engines.com: — Режим доступа: https://db-engines.com/en/system/Cachelot.io%3BMemcached%3BRedis
- ↑ Official web-site [Электронный ресурс] : Материал из https://cachelot.io/: — Режим доступа: https://cachelot.io/
- ↑ Robin Hood Hashing [Электронный ресурс] : Материал из https://www.sebastiansylvan.com: — Режим доступа: https://www.sebastiansylvan.com/post/robin-hood-hashing-should-be-your-default-hash-table-implementation/
- ↑ Github [Электронный ресурс] : Материал из https://github.com: — Режим доступа: https://github.com/cachelot/cachelot
ISSN 2542-0356
Следуй за Полисом
Оставайся в курсе последних событий
Лицензия
Если не указано иное, содержание этой страницы доступно по лицензии Creative Commons «Attribution-NonCommercial-NoDerivatives» 4.0, а примеры кода – по лицензии Apache 2.0. Подробнее см. Условия использования.