# Almacenamiento de Configuración

El Almacenamiento de Configuración (Storage) es un almacenamiento de clave-valor integrado en FIRERPA con persistencia. Incluso si FIRERPA o el dispositivo se reinician, aún puede leer estas variables en el próximo inicio. Este Storage le permite almacenar información de forma persistente en el dispositivo para que la lean diferentes procesos de cliente, para compartir la configuración del dispositivo, como cuentas de inicio de sesión u otra información independiente. Incluso puede almacenar configuraciones cifradas dentro de la máquina.

```{attention}
La capacidad total del Storage integrado es de 128 MB. Por favor, no lo utilice para almacenar grandes cantidades de datos. No admite la enumeración de los nombres de contenedores o claves existentes en el almacenamiento. Debe conocer el nombre completo del contenedor y el nombre de la clave para poder leer un valor del contenedor; de lo contrario, nunca podrá leerlo.
```

## Obtener el Storage

Puede obtener un objeto de almacenamiento (Storage) utilizando el siguiente código, lo que le permitirá realizar operaciones posteriores.

```python
storage = d.stub("Storage")
```

## Limpiar el Storage

Puede utilizar el siguiente código para borrar toda la información del almacenamiento (Storage), incluidos los contenedores. Puede entenderlo simplemente como formatear el Storage.

```python
storage.clear()
```

## Obtener un Contenedor

Puede obtener un objeto contenedor de clave-valor utilizando el siguiente código. El almacenamiento es el sistema principal, y un contenedor es un "bucket" dentro de él. Todas sus operaciones de lectura y escritura posteriores se realizarán en este contenedor.

```python
container = storage.use("container_name")
```

## Obtener un Contenedor Cifrado

Si necesita almacenar valores de forma segura, por ejemplo, cuando el dispositivo será utilizado por otras personas pero no desea que lean la configuración almacenada, puede utilizar un contenedor cifrado. A diferencia de obtener un contenedor simple, un contenedor cifrado almacenará sus claves y valores de forma encriptada. Otras personas necesitarán una contraseña u otra forma de verificación para leerlos correctamente.

Nuestra biblioteca viene con un encriptador/desencriptador `FernetCryptor`. También puede implementar su propio algoritmo de cifrado único siguiendo el ejemplo de `FernetCryptor`. Solo necesita implementar los métodos `encrypt` y `decrypt`.

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

## Eliminar un Contenedor

Puede utilizar el siguiente código para eliminar todas las claves y valores almacenados en el contenedor llamado `container_name`. Esta operación es equivalente a eliminar el "bucket".

```python
storage.remove("container_name")
```

## Escribir Clave-Valor en un Contenedor

Puede utilizar la siguiente llamada de ejemplo para establecer el valor de `key_name` en `"value"`. El valor puede ser cualquier variable serializable por msgpack.

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

## Leer Clave-Valor de un Contenedor

Puede utilizar el siguiente método para obtener el valor de `key_name`. Si no existe, devolverá `None`.

```python
container.get("key_name")
```

## Obtener el Tiempo de Vida (TTL)

Puede obtener el tiempo de vida de `key_name` con la siguiente llamada. `-2` indica que la clave no existe, `-1` significa que nunca expira, y cualquier otro entero positivo representa los segundos restantes de vida de la clave.

```python
container.ttl("key_name")
```

## Establecer el Tiempo de Vida (TTL)

Puede establecer el tiempo de vida de una clave-valor con la siguiente llamada. Por ejemplo, la siguiente llamada establecerá la clave-valor y hará que se elimine automáticamente después de 10 segundos.

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

Alternativamente, si ya ha establecido esta clave y ahora desea establecer su tiempo de vida, puede usar el siguiente método. `key_name` se eliminará automáticamente después de 60 segundos.

```python
container.expire("key_name", 60)
```

## Escritura Condicional

Puede realizar la siguiente llamada para establecer la clave-valor solo si `key_name` no existe. Si ya existe, no se realizará ninguna operación.

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

## Verificar Existencia

Puede usar la siguiente llamada para verificar si `key_name` existe en el contenedor.

```python
container.exists("key_name")
```

## Eliminar Clave-Valor de un Contenedor

Puede usar la siguiente llamada para eliminar `key_name` y su valor del contenedor.

```python
container.delete("key_name")
```