Начало работы с 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.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *