# List

### 資料結構

Redis中的串列/列表(List)資料結構為一個Key對應一組[**鏈結串列(Linked List)**](https://zh.wikipedia.org/wiki/%E9%93%BE%E8%A1%A8)，是由多個節點組成的一種[**線性表(Linear List)**](https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E8%A1%A8)，每個節點內會儲存到上一個與下一個節點的指標(Pointer)，每個節點中可以儲存一組字符串資料，本章稱之為元素(item)。

![](https://224613336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mb64kSCne8LKJiDOD49%2F-Mf7U6Up6yXTGPjdte9e%2F-Mf7YjcUu47A25B7jXzk%2F%E7%B4%A0%E6%9D%90.005.jpeg?alt=media\&token=e2d2dd99-d3f4-4518-a7d5-468ce11b11d7)

雖然是線性表，但不一定要按照線性的順序儲存資料，Redis提供了一些方便的指令來操作List資料，例如可以在List的前、後端推入新節點([**lpush、rpush**](https://aiii-mike.gitbook.io/redis/command/list/rpush))、刪除舊節點([**lpop、rpop**](https://aiii-mike.gitbook.io/redis/command/list/rpop-and-lpop))，或從中段節點安插新節點([**linsert**](https://aiii-mike.gitbook.io/redis/command/list/lset))，也提供了同時刪除與新增的組合情境([**rpoplpush**](https://aiii-mike.gitbook.io/redis/command/list/rpoplpush))；甚至，List資料還包含了阻塞功能的指令([**brpop**](https://aiii-mike.gitbook.io/redis/command/list/brpop-and-blpop))，並得以實現[**訊息佇列(Message Queue)**](https://zh.wikipedia.org/wiki/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97)等應用情境。

![Detail of List Structure](https://224613336-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mb64kSCne8LKJiDOD49%2F-Mcn-B1KATLQMC2-2WAX%2F-Mcn-Fw_QwTC0Lp8ZxjB%2Flist.png?alt=media\&token=d2141aa1-bd57-4afe-90bf-37a885024df1)

值得注意的是與集合(Set)或有序集合(Zset)的最大差別，串列(List)得以儲存重複的元素(item)，而集合(Set)或有序集合(Zset)中所儲存的成員(member)不能重複。
