# set & get

### 1. 基本語法

#### (1) set

{% tabs %}
{% tab title="TypeScript" %}
#### **set(`key` , `value`, `['EX', seconds|'PX', milliseconds]`, `['NX'|'XX']`,`callback`)**&#x20;
{% endtab %}

{% tab title="Redis" %}
**set `key`** **`value` \[ EX `seconds`| PX `milliseconds` ] \[ NX | XX ]**&#x20;
{% endtab %}
{% endtabs %}

在Redis資料庫中設置一組名稱&#x70BA;**`key`**&#x4E14;對應值&#x70BA;**`value`**&#x7684;**String**資料。設置成功則回傳OK，失敗則回傳空值。

若額外追&#x52A0;**`EX`**(&#x6216;**`PX`**)參數數可為&#x8A72;**`key`**&#x8CC7;料設&#x7F6E;**`seconds`**&#x79D2;(&#x6216;**`milliseconds`**&#x6BEB;秒)的效期(**expired time**)，抵達效期時間，則自動刪除&#x8A72;**`key`**&#x8CC7;料。

若額外追&#x52A0;**`NX`**&#x53C3;&#x6578;**(Not Exist)**，在設置資料前會先判&#x65B7;**`key`**&#x540D;稱是否已經存在，**`key`**&#x4E0D;存在才設置資料；相反的，**`XX`**&#x53C3;&#x6578;**(Exist)**，則&#x662F;**`key`**&#x5B58;在才設置並覆蓋資料。

{% hint style="success" %}
`redis.print`可直接印出結果，顯示`Reply:<output>`
{% endhint %}

{% tabs %}
{% tab title="TypeScript" %}
```typescript
client.set("foo", "bar", redis.print);
```
{% endtab %}

{% tab title="redis-cli" %}
```bash
127.0.0.1:6379> set foo bar
```
{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Output-TS" %}
```bash
Reply: OK
```
{% endtab %}

{% tab title="Output-Redis" %}
```
OK
```
{% endtab %}
{% endtabs %}

#### (2) get

{% tabs %}
{% tab title="TypeScript" %}
**get(`key`, `callback`)**
{% endtab %}

{% tab title="redis-cli" %}
**get `key`**
{% endtab %}
{% endtabs %}

取&#x5F97;**`key`**&#x540D;稱對應的**String**資料，&#x82E5;**`key`**&#x5B58;在且為**String**資料，則回傳對應**Value**。

&#x82E5;**`key`**&#x4E0D;存在，則回傳空值。&#x82E5;**`key`**&#x5B58;在但不是**String**資料，則回傳錯誤訊息。

{% tabs %}
{% tab title="TypeScript" %}
```typescript
client.set("foo", "bar", redis.print);
client.get("foo", (err, foo_value) => {
    console.log(foo_value); 
})
```
{% endtab %}

{% tab title="redis-cli" %}
```bash
127.0.0.1:6379> get foo
```
{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Output-TS" %}
```bash
Reply: OK
bar
```
{% endtab %}

{% tab title="Output-redis" %}
```
"bar"
```
{% endtab %}
{% endtabs %}

### 2. 範例

#### (1) 鎖定機制

透&#x904E;**`NX`**&#x8207;**`EX`**&#x53C3;數實現&#x5C07;**`key`**&#x8CC7;料鎖定(**Lock**)，在鎖定後不予修改。

{% tabs %}
{% tab title="TypeScript" %}
```typescript
client.set("lock:foo", "bar", 'EX', 10, 'NX', redis.print);
client.get("lock:foo", redis.print)

client.set("lock:foo", "bar2", 'EX', 10, 'NX', redis.print);
client.get("lock:foo", redis.print)
```
{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Output-TS" %}
```bash
Reply: OK
Reply: bar

Reply: null
Reply: bar
```
{% endtab %}
{% endtabs %}

