# zadd

### 1. 基本語法

#### zad&#x64;**(`key`,**`[NX|XX]`,`[CH], [INCR]`,**`score`,`member`** **`[, score, member,...]`)**&#x20;

新增成員到有序集合，每個成員必須對應一個分&#x6578;**`score`**，成員順序&#x70BA;**`score`**&#x7531;小到大排列。在不給定**CH**參數時，**zadd**預設回傳新增的成&#x54E1;**`member`**&#x6578;量。

| Parameter | Meaning                                                                                                                                                                       |
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| NX        | <p>只添加新成員，不允許更改現有成員。</p><p>若<strong><code>member</code></strong>不存在，才新增分數<strong><code>score</code></strong>與成員<strong><code>member</code></strong></p>                       |
| XX        | <p>只更新現有成員，不允許新增成員。</p><p>若<strong><code>member</code></strong>存在，才更新該成員分數<strong><code>score</code></strong></p>                                                             |
| CH        | <p><strong>zadd</strong>預設回傳「新增成員」的數量，改變現有成員分數不影響回傳值；</p><p>若標註<strong>CH</strong>參數，則<strong>zadd</strong>回傳「新增成員」及「分數改變」的成員總數量。</p>                                         |
| INCR      | 功能與[**zincrby**](https://app.gitbook.com/@aiii-mike/s/redis/~/drafts/-MdPeOBBlshNK2Wuhupd/command/zset/zincrby)相同，標註**INCR**參數下，只能使用一&#x7D44;**`score`**&#x8207;**`member`。** |



### **2. 範例**

**(1) 新增有序集合，為每個成員指定分數**

{% tabs %}
{% tab title="TypeScript" %}
```typescript
client.zadd('order:set', 2, 'A');
client.zadd('order:set', 1, 'B');
client.zadd('order:set', -1, 'C');
client.zadd('order:set', -2, 'D');

client.zrange('order:set', 0, -1, redis.print);
```
{% endtab %}
{% endtabs %}

| **成員** | 分數 |
| ------ | -- |
| A      | 2  |
| B      | 1  |
| C      | -1 |
| D      | -2 |

{% tabs %}
{% tab title="Output-TS" %}
```
Reply: D,C,B,A
```
{% endtab %}
{% endtabs %}

**(2) NX：只新增成員，不允許更改現有成員**

{% tabs %}
{% tab title="TypeScript" %}
```typescript
client.del('order:set');
client.zadd('order:set', 2, 'A');
client.zadd('order:set', 1, 'B');
client.zadd('order:set', -1, 'C');
client.zadd('order:set', -2, 'D');

client.zadd('order:set', "NX", 3, 'D', 4, 'E', redis.print);
client.zrange('order:set', 0, -1, redis.print);
```
{% endtab %}
{% endtabs %}

| **成員** | 分數     |
| ------ | ------ |
| **E**  | **4**  |
| A      | 2      |
| B      | 1      |
| C      | -1     |
| **D**  | **-2** |

{% tabs %}
{% tab title="Output-TS" %}
```
Reply: 1
Reply: D,C,B,A,E
```
{% endtab %}
{% endtabs %}

**(3) XX：只修改現有成員分數，不允許新增成員**

{% tabs %}
{% tab title="TypeScript" %}
```typescript
client.del('order:set');
client.zadd('order:set', 2, 'A');
client.zadd('order:set', 1, 'B');
client.zadd('order:set', -1, 'C');
client.zadd('order:set', -2, 'D');
client.zadd('order:set', "XX", 3, 'D', 4, 'E', redis.print);
client.zrange('order:set', 0, -1, redis.print);
```
{% endtab %}
{% endtabs %}

| **成員** | 分數    |
| ------ | ----- |
| **D**  | **3** |
| A      | 2     |
| B      | 1     |
| C      | -1    |

{% tabs %}
{% tab title="Output-TS" %}
```
Reply: 0
Reply: C,B,A,D
```
{% endtab %}
{% endtabs %}

**(4) CH : 回傳新增及更改分數的成員總數**

{% tabs %}
{% tab title="TypeScript" %}
```typescript
client.del('order:set');
client.zadd('order:set', 2, 'A');
client.zadd('order:set', 1, 'B');
client.zadd('order:set', -1, 'C');
client.zadd('order:set', -2, 'D');

client.zadd('order:set', "CH", 3, 'D', 4, 'E', redis.print);
client.zrange('order:set', 0, -1, redis.print);
```
{% endtab %}
{% endtabs %}

| **成員** | 分數    |
| ------ | ----- |
| **E**  | **4** |
| **D**  | **3** |
| A      | 2     |
| B      | 1     |
| C      | -1    |

{% tabs %}
{% tab title="Output-TS" %}
```
Reply: 2
Reply: C,B,A,D,E
```
{% endtab %}
{% endtabs %}

**(5) INCR：成員存在則加分，不存在則新增**

{% tabs %}
{% tab title="TypeScript" %}
```typescript
client.del('order:set');
client.zadd('order:set', 2, 'A');
client.zadd('order:set', 1, 'B');
client.zadd('order:set', -1, 'C');
client.zadd('order:set', -2, 'D');

client.zadd('order:set', "INCR", 10, 'D', redis.print);
client.zadd('order:set', "INCR", 10, 'E', redis.print);
```
{% endtab %}
{% endtabs %}

| **成員** | 分數              |
| ------ | --------------- |
| **E**  | **10**          |
| **D**  | **-2 + 10 = 8** |
| A      | 2               |
| B      | 1               |
| C      | -1              |

{% tabs %}
{% tab title="Output-TS" %}
```
Reply: 8
```
{% endtab %}
{% endtabs %}
