Начало работы с Rocksdb и Python
В этом посте я собираюсь обсудить RocksDB.
РоксДБ — это встраиваемая постоянная система хранения ключей и значений, разработанная Facebook. Первоначально он был разветвлен из LevelDB, созданного Google.
Согласно с Википедия:
RocksDB — это высокопроизводительная встроенная база данных для данных типа «ключ-значение». Это ответвление Google LevelDB, оптимизированное для использования многих ядер ЦП и эффективного использования быстрых хранилищ, таких как твердотельные накопители (SSD), для рабочих нагрузок, связанных с вводом/выводом (I/O). Он основан на структуре данных дерева слияния (LSM-дерева) с логарифмической структурой. Он написан на C++ и предоставляет официальные языковые привязки для C++, C и Java; наряду со многими привязками сторонних языков.
RocksDB специально оптимизирован для флэш-накопителей и быстрых хранилищ для доступа к данным с малой задержкой. Как и Redis, RocksDB также хранит данные в памяти, но, в отличие от Redis, это не сервер, а встраиваемая библиотека, похожая на SQLite. RocksDB широко используется для хранения постоянных данных на SSD в Facebook и различными службами, которые обслуживают онлайн-запросы на жестких дисках.
Возможности использования RocksDB безграничны, вы можете использовать его в качестве механизма хранения, который хранит данные и создает персонализированную домашнюю страницу для каждого пользователя. Таким образом, вместо того, чтобы делать несколько запросов SELECT на основе пользователя, который нагружает БД, вы можете хранить эти данные в формате ключ/значение, где UserID может служить ключом, который содержит все данные в таких форматах, как JSON.
В этом посте я обсуждаю базовое использование RocksDB независимо от определенного варианта использования и то, как вы можете использовать его в своих приложениях Python.
Установка и настройка
Чтобы использовать RocksDB в Python, в вашей системе должен быть установлен RocksDB, а затем с помощью привязки RocksDB к Python вы можете получить доступ к RocksDB в своих программах. Так как я не хотел возиться со своей средой Mac, я скачал образ Python на основе Debian и установил в него RocksDB. Ниже приведены шаги. Сначала установите необходимые зависимости и саму RocksDB:
apt install rocksdb-tools librocksdb5.17 librocksdb-dev libsnappy-dev liblz4-dev
На данный момент, librocksdb5.17
была последней версией, доступной для меня в Docker.
а потом
pip install python-rocksdb
Я связал свой код VS с удаленным контейнером, чтобы я мог напрямую кодировать внутри контейнера. Использовать это расширение VSCode для этой цели и прикрепите свой контейнер. Вот как выглядит мой VSCode после подключения к нему удаленного контейнера и выбора удаленного интерпретатора Python на основе докеров.
Сладкий! не так ли?
Разработка
Давайте импортируем библиотеку и посмотрим, действительно ли она работает или нет.
import rocksdb
if __name__ == " __main__":
print(rocksdb)
Если что-то действительно установлено, это будет выглядеть следующим образом:
root@9f7d3fc73b74:/code# /usr/local/bin/python /code/main.py
<module 'rocksdb' from '/usr/local/lib/python3.9/site-packages/rocksdb/ __init__.py'>
давайте двигаться вперед
if __name__ == " __main__":
db = rocksdb.DB("test.db", rocksdb.Options(create_if_missing=True))
db.put(b"a", b"ROFL")
print(db.get(b"a").decode("utf-8"))
Первая строка открывает файл БД с определенными параметрами. Вот, я поставил create_if_missing
к True
чтобы избежать ошибок «файл не найден». Затем я установил a
ключ с текстом ROFL
. Если вы заметили, что я использую байтовый тип b
здесь как для ключей, так и для значений. RocksDB поддерживает поток байтов для ключей вместо строки или другого типа данных. Позже я преобразовал его вstr
позвонив decode('utf-8)
Посмотрим, что происходит в папке, где была создана БД. Первое, что я заметил, было шокирующим для меня, что test.db
на самом деле это был не файл, а папка.
root@9f7d3fc73b74:/code# ls -la
total 16
drwxr-xr-x 3 root root 4096 Oct 3 15:24 .
drwxr-xr-x 1 root root 4096 Oct 3 13:37 ..
-rw-r--r-- 1 root root 180 Oct 3 15:20 main.py
drwxr-xr-x 2 root root 4096 Oct 3 15:24 test.db
root@9f7d3fc73b74:/code#
Когда вы выполняете cd test.db
и список файлов показывает следующее:
root@9f7d3fc73b74:/code/test.db# ls -l
total 152
-rw-r--r-- 1 root root 27 Oct 3 15:24 000003.log
-rw-r--r-- 1 root root 16 Oct 3 15:24 CURRENT
-rw-r--r-- 1 root root 37 Oct 3 15:24 IDENTITY
-rw-r--r-- 1 root root 0 Oct 3 15:24 LOCK
-rw-r--r-- 1 root root 15695 Oct 3 15:24 LOG
-rw-r--r-- 1 root root 13 Oct 3 15:24 MANIFEST-000001
-rw-r--r-- 1 root root 4721 Oct 3 15:24 OPTIONS-000005
Он содержит файл журнала, файл опций и еще несколько. давайте посмотрим содержимое 000003.журнал файл.
root@9f7d3fc73b74:/code/test.db# cat 000003.log
���aROFLroot@9f7d3fc73b74:/code/test.db#
Как вы поняли, он не хранит данные в текстовом формате. Вы можете ясно видеть _a(Key) _and ROFL(значение) хранится в сжатом двоичном формате. CURRENT сообщает о последнем журнале манифеста.
root@9f7d3fc73b74:/code/test.db# cat CURRENT
MANIFEST-000001
IDENTITY отслеживает изменения. В моем случае показывает:
root@9f7d3fc73b74:/code/test.db# cat IDENTITY
c55f9d31-f622-4335-8cbf-f3ca9ce324ef
Затем 0-байтовый ЗАМОК файл. В RocksDB только один процесс может открыть файл, следовательно, один процесс может записывать данные. ЖУРНАЛ файл, как следует из названия, регистрирует все. МАНИФЕСТ-000001 в нем не было ничего читаемого. Следующий файл — OPTIONS-000005, в котором есть все доступные параметры с их текущими значениями. После запуска grep
команды показывает следующее:
root@9f7d3fc73b74:/code/test.db# cat OPTIONS-000005 | grep missing
create_missing_column_families=false
create_if_missing=true
Как вы видете,create_if_missing
установлен на true
что вполне очевидно.
Если вас больше интересуют внутренности, вы можете посетить это Вики-страница.
Точно так же вы можете удалить ключ.
db.delete(b"a")
print(db.get(b"a").decode("utf-8"))
При запуске выдает следующую ошибку:
root@9f7d3fc73b74:/code/test.db# /usr/local/bin/python /code/main.py
ROFL
Traceback (most recent call last):
File "/code/main.py", line 8, in <module>
print(db.get(b"a").decode("utf-8"))
AttributeError: 'NoneType' object has no attribute 'decode'
root@9f7d3fc73b74:/code/test.db#
Поскольку а ключ уже был удален, при доступе к нему выбрасывалось исключение. Порт C++ и Java также предоставляет возможность ТтлДБ который позволяет вам установить срок действия ключей, функцию, которую вы можете использовать для использования RocksDB в качестве веб-кэша. К сожалению, он по-прежнему недоступен в привязках Python.
Вывод
В этом посте я представил RocksDB как хранилище ключей/значений. RocksDB также используется в качестве механизма хранения и используется такими системами БД, как ArangoDB, MyRocks (механизм хранения MySQL на основе RocksDB), CockroachDB и другими. Вы можете использовать его в качестве замены для Кэш памяти если вы используете флэш-накопители. Вот всеобъемлющее список использования RocksDB.