# 配置儲存體

配置儲存體 Storage 是 FIRERPA 內建的鍵值儲存，具有持久性，即使 FIRERPA 或裝置重新啟動，您依然可以在下次啟動時讀取這些變數。此 Storage 可讓您在裝置中持久化儲存資訊以供不同的用戶端程序讀取，用以共享裝置設定如登入帳號或其他獨立資訊。您甚至可以在機器內儲存加密設定。

```{attention}
內建 Storage 總容量為 128MB，請勿用來儲存大量資料，不支援列出儲存體中存在的容器名稱或鍵名，您必須完整知道容器名稱以及鍵的名稱才能從容器中讀取值，否則將永遠無法讀取。
```

## 取得 Storage

您可以透過以下程式碼，取得一個儲存體 Storage 物件，以便進行後續操作。

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

## 清空 Storage

您可以透過以下程式碼，清空儲存體 Storage 中的所有資訊，包括容器，您可以簡單理解為 - 格式化 Storage。

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

## 取得容器

您可以透過以下程式碼，取得一個鍵值儲存容器物件。儲存體是儲存體，容器是儲存體下的一個桶 (bucket)，您後續的讀寫均是對這個桶進行操作。

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

## 取得加密容器

如果您還需要安全地儲存值，例如，當該裝置會被其他人使用，但您不希望儲存的設定被其他人讀取時，您可以使用加密容器。它與簡單地取得容器不同，加密容器會對您設定的鍵值進行加密儲存，其他人需要密碼或其他驗證才能正確讀取。

我們的函式庫內建了一個 FernetCryptor 加解密器，您也可以參照 FernetCryptor 實作自己獨特的加密演算法。您只需要實作 `encrypt` 和 `decrypt` 方法即可。

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

## 刪除容器

您可以透過以下程式碼，清除名為 `container_name` 的容器中儲存的所有鍵值，此操作也相當於刪除該桶。

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

## 向容器寫入鍵值

您可以透過以下的範例呼叫，將 `key_name` 的值設為 "value"，其中，值支援任何 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")
```

## 從容器讀取鍵值

您可以透過以下方法，取得 `key_name` 的值，如果不存在，則返回 `None`。

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

## 取得存留時間

您可以透過以下呼叫，取得 `key_name` 的存留時間。-2 表示該鍵不存在，-1 表示永不過期，其他正整數則為該 key 的剩餘存活秒數。

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

## 設定存留時間

您可以透過以下呼叫，設定鍵值的存留時間。例如，下方的呼叫方式，將會在設定鍵值的同時，使這個鍵值在 10 秒後自動被刪除。

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

或者，如果您之前已經設定過這個鍵，現在想為其設定存留時間，可以如下使用，60 秒後，`key_name` 將會被自動刪除。

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

## 條件式寫入

您可以如下呼叫，這樣僅當 `key_name` 不存在時才會設定該鍵值，如果已經存在則不會進行任何操作。

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

## 判斷是否存在

您可以如下呼叫，來檢查 `key_name` 是否存在於容器中。

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

## 從容器刪除鍵值

您可以如下呼叫，來從容器中刪除 `key_name` 及其值。

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