# ที่เก็บข้อมูลการกำหนดค่า

ที่เก็บข้อมูลการกำหนดค่า Storage เป็นที่เก็บข้อมูลแบบ key-value ที่มีในตัวของ FIRERPA ซึ่งมีความสามารถในการคงอยู่ถาวร (persistence) แม้ว่า FIRERPA หรืออุปกรณ์จะรีสตาร์ท คุณยังคงสามารถอ่านค่าตัวแปรเหล่านี้ได้ในการเปิดใช้งานครั้งถัดไป Storage นี้ช่วยให้คุณสามารถจัดเก็บข้อมูลอย่างถาวรในอุปกรณ์เพื่อให้โปรเซสของไคลเอ็นต์ต่างๆ สามารถอ่านได้ เพื่อใช้ในการแชร์การกำหนดค่าของอุปกรณ์ เช่น บัญชีล็อกอิน หรือข้อมูลอิสระอื่นๆ คุณยังสามารถจัดเก็บการกำหนดค่าที่เข้ารหัสไว้ในเครื่องได้อีกด้วย

```{attention}
ที่เก็บข้อมูล Storage ในตัวมีความจุทั้งหมด 128MB โปรดอย่าใช้เพื่อเก็บข้อมูลจำนวนมาก ไม่รองรับการแสดงรายชื่อคอนเทนเนอร์หรือชื่อคีย์ที่มีอยู่ในที่เก็บข้อมูล คุณต้องทราบชื่อคอนเทนเนอร์และชื่อคีย์ทั้งหมดจึงจะสามารถอ่านค่าจากคอนเทนเนอร์ได้ มิฉะนั้นจะไม่สามารถอ่านได้เลย
```

## การเข้าถึง Storage

คุณสามารถใชโค้ดต่อไปนี้เพื่อเข้าถึงอ็อบเจกต์ที่เก็บข้อมูล Storage เพื่อที่จะดำเนินการในขั้นตอนต่อไปได้

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

## การล้างข้อมูลใน Storage

คุณสามารถใช้โค้ดต่อไปนี้เพื่อล้างข้อมูลทั้งหมดในที่เก็บข้อมูล Storage รวมถึงคอนเทนเนอร์ทั้งหมด ซึ่งอาจเปรียบได้กับการฟอร์แมต Storage

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

## การเข้าถึงคอนเทนเนอร์

คุณสามารถใช้โค้ดต่อไปนี้เพื่อเข้าถึงอ็อบเจกต์คอนเทนเนอร์สำหรับเก็บข้อมูลแบบ key-value ที่เก็บข้อมูล (Storage) ก็คือที่เก็บข้อมูล ส่วนคอนเทนเนอร์ (container) ก็เปรียบเสมือนบัคเก็ต (bucket) ที่อยู่ภายใต้ที่เก็บข้อมูลนั้น การอ่านและเขียนข้อมูลของคุณในขั้นตอนต่อไปจะเป็นการดำเนินการกับบัคเก็ตนี้

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

## การเข้าถึงคอนเทนเนอร์ที่เข้ารหัส

หากคุณต้องการจัดเก็บค่าอย่างปลอดภัย เช่น ในกรณีที่อุปกรณ์นี้จะถูกใช้งานโดยผู้อื่น แต่คุณไม่ต้องการให้การกำหนดค่าที่คุณเก็บไว้ถูกอ่านโดยผู้อื่น คุณสามารถใช้คอนเทนเนอร์ที่เข้ารหัสได้ ซึ่งแตกต่างจากการเข้าถึงคอนเทนเนอร์ทั่วไป คอนเทนเนอร์ที่เข้ารหัสจะทำการเข้ารหัส key-value ที่คุณตั้งค่าไว้ก่อนจัดเก็บ ผู้อื่นจะต้องใช้รหัสผ่านหรือการยืนยันตัวตนอื่น ๆ จึงจะสามารถอ่านข้อมูลได้อย่างถูกต้อง

ไลบรารีของเรามาพร้อมกับ FernetCryptor สำหรับการเข้ารหัสและถอดรหัส คุณยังสามารถสร้างอัลกอริทึมการเข้ารหัสเฉพาะของคุณเองตามแบบของ FernetCryptor ได้ เพียงแค่คุณต้อง implement เมธอด encrypt และ decrypt

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

## การลบคอนเทนเนอร์

คุณสามารถใช้โค้ดต่อไปนี้เพื่อล้าง key-value ทั้งหมดที่เก็บอยู่ในคอนเทนเนอร์ชื่อ `container_name` การดำเนินการนี้เทียบเท่ากับการลบบัคเก็ตทิ้ง

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

## การเขียน Key-Value ลงในคอนเทนเนอร์

คุณสามารถเรียกใช้ตัวอย่างต่อไปนี้เพื่อตั้งค่าของ `key_name` เป็น "value" โดยที่ค่า (value) สามารถเป็นตัวแปรชนิดใดก็ได้ที่สามารถ serialize ด้วย 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-Value จากคอนเทนเนอร์

คุณสามารถใช้วิธีต่อไปนี้เพื่อดึงค่าของ `key_name` หากไม่มีอยู่ จะคืนค่า `None`

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

## การรับเวลาคงอยู่ (TTL)

คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อรับเวลาคงอยู่ (TTL) ของ `key_name` โดยที่ -2 หมายถึงคีย์ไม่มีอยู่, -1 หมายถึงไม่มีวันหมดอายุ, และจำนวนเต็มบวกอื่น ๆ คือจำนวนวินาทีที่เหลืออยู่ของคีย์นั้น

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

## การตั้งค่าเวลาคงอยู่ (TTL)

คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อตั้งค่าเวลาคงอยู่ของ key-value ตัวอย่างเช่น การเรียกใช้ด้านล่างนี้จะตั้งค่า key-value พร้อมกับทำให้ key-value นี้ถูกลบโดยอัตโนมัติหลังจากผ่านไป 10 วินาที

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

หรือหากคุณได้ตั้งค่าคีย์นี้ไว้ก่อนแล้ว และตอนนี้ต้องการตั้งเวลาคงอยู่ให้มัน คุณสามารถใช้คำสั่งด้านล่างนี้ได้ หลังจาก 60 วินาที `key_name` จะถูกลบโดยอัตโนมัติ

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

## การเขียนตามเงื่อนไข

คุณสามารถเรียกใช้คำสั่งด้านล่างนี้ ซึ่งจะทำการตั้งค่า key-value ก็ต่อเมื่อ `key_name` ยังไม่มีอยู่เท่านั้น หากมีอยู่แล้ว จะไม่มีการดำเนินการใด ๆ

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

## การตรวจสอบว่ามีอยู่หรือไม่

คุณสามารถเรียกใช้คำสั่งด้านล่างนี้เพื่อตรวจสอบว่า `key_name` มีอยู่ในคอนเทนเนอร์หรือไม่

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

## การลบ Key-Value ออกจากคอนเทนเนอร์

คุณสามารถเรียกใช้คำสั่งด้านล่างนี้เพื่อลบ `key_name` และค่าของมันออกจากคอนเทนเนอร์

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