Хранилище конфигурации

Хранилище конфигурации Storage — это встроенное в FIRERPA персистентное хранилище типа "ключ-значение". Даже после перезапуска FIRERPA или устройства вы сможете прочитать эти переменные при следующем запуске. Это хранилище позволяет постоянно хранить информацию на устройстве для чтения различными клиентскими процессами, чтобы совместно использовать конфигурацию устройства, такую как учетные данные для входа или другую независимую информацию. Вы даже можете хранить зашифрованную конфигурацию на машине.

Внимание

Общий объем встроенного хранилища Storage составляет 128 МБ. Не используйте его для хранения больших объемов данных. Не поддерживается перечисление имен контейнеров или ключей, существующих в хранилище. Вы должны точно знать имя контейнера и имя ключа, чтобы прочитать значение из контейнера, иначе прочитать его будет невозможно.

Получение Storage

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

storage = d.stub("Storage")

Очистка Storage

С помощью следующего кода вы можете очистить всю информацию в хранилище Storage, включая контейнеры. Это можно упрощенно понимать как форматирование Storage.

storage.clear()

Получение контейнера

С помощью следующего кода вы можете получить объект контейнера для хранения пар "ключ-значение". Хранилище — это хранилище, а контейнер — это сегмент (bucket) внутри него. Все последующие операции чтения и записи выполняются с этим сегментом.

container = storage.use("container_name")

Получение зашифрованного контейнера

Если вам нужно безопасно хранить значения, например, когда устройством будут пользоваться другие люди, и вы не хотите, чтобы сохраненная вами конфигурация была прочитана ими, вы можете использовать зашифрованный контейнер. В отличие от простого получения контейнера, зашифрованный контейнер будет шифровать устанавливаемые вами пары "ключ-значение", и для их корректного чтения другим потребуется пароль или иная проверка.

Наша библиотека поставляется со встроенным шифратором FernetCryptor. Вы также можете реализовать свой собственный уникальный алгоритм шифрования по примеру FernetCryptor. Вам нужно лишь реализовать методы encrypt и decrypt.

from lamda.client import FernetCryptor
container = storage.use("container_name", cryptor=FernetCryptor,
                                          key="this_is_password")

Удаление контейнера

С помощью следующего кода вы можете удалить все пары "ключ-значение", хранящиеся в контейнере с именем container_name. Эта операция эквивалентна удалению сегмента (bucket).

storage.remove("container_name")

Запись пары "ключ-значение" в контейнер

С помощью следующих примеров вы можете установить значение "value" для ключа key_name. Значение может быть любой переменной, сериализуемой с помощью msgpack.

container.set("key_name", [1, 2, 3])
container.set("key_name", {"john": "due"})
container.set("key_name", b"value")
container.set("key_name", "value")

Чтение пары "ключ-значение" из контейнера

С помощью следующего метода вы можете получить значение для key_name. Если ключ не существует, возвращается None.

container.get("key_name")

Получение времени жизни (TTL)

С помощью следующего вызова вы можете получить время жизни для key_name. -2 означает, что ключ не существует, -1 — что срок действия не истекает, а любое другое положительное целое число — это оставшееся время жизни ключа в секундах.

container.ttl("key_name")

Установка времени жизни (TTL)

С помощью следующего вызова вы можете установить время жизни для пары "ключ-значение". Например, следующий вызов установит пару "ключ-значение" и автоматически удалит ее через 10 секунд.

container.setex("key_name", "value", 10)

Или, если вы уже установили этот ключ ранее и теперь хотите задать для него время жизни, вы можете использовать следующий код. Через 60 секунд key_name будет автоматически удален.

container.expire("key_name", 60)

Условная запись

Вы можете использовать следующий вызов, который установит значение для ключа key_name только в том случае, если он еще не существует. Если ключ уже существует, никаких действий выполнено не будет.

container.setnx("key_name", "value")

Проверка существования

Вы можете использовать следующий вызов, чтобы проверить, существует ли key_name в контейнере.

container.exists("key_name")

Удаление пары "ключ-значение" из контейнера

Вы можете использовать следующий вызов, чтобы удалить ключ key_name и его значение из контейнера.

container.delete("key_name")