---
# System prepended metadata

title: 技術｜系統設計 Redis
tags: [技術]

---

# 技術｜系統設計 Redis
- https://redis.io/docs/latest/develop/get-started/

## Redis 的基本用法
- 使用 docker 架設 redis
    ```bash=
    docker pull redis
    docker run --name redis-server -p 6379:6379 -d redis
    ```
- 使用 python API 和 redis 互動
    ```bash=
    pip3 install redis
    ```
    ```python=
    import redis

    def main():
        # Redis default port is 6379
        # Redis default supports 16 databases
        client = redis.Redis(host='localhost', port=6379, db=0)

        client.set('foo', 'bar')

        value = client.get('foo')
        if value is None:
            print('The key "foo" does not exist')
        else:
            print(f'The value of "foo" is: {value.decode("utf-8")}')

    if __name__ == '__main__':
        main()
    ```
- Redis 原生支持多種資料結構
    - String
        - 用途：最基本的資料類型，用於存儲簡單的鍵值對
        - 操作：SET、GET、INCR、DECR、MGET、APPEND
    - Lists
        - 用途：儲存多個有序的字串元素，支持從兩端操作列表元素
        - 操作：LPUSH、RPUSH、LPOP、RPOP、LRANGE
    - Sets
        - 用途：存儲不重複的無序元素集合
        - 操作：SADD、SREM、SMEMBERS、SINTER、SUNION、SDIFF
    - Sorted Sets
        - 用途：類似於集合，但每個元素關聯一個分數，集合中的元素根據分數排序
        - 操作：ZADD、ZRANGE、ZREM、ZINCRBY、ZRANGEBYSCORE
    - Hashes
        - 用途：存儲鍵-值對的集合，類似於 Python 的字典（dict）。
        - 操作：HSET、HGET、HGETALL、HMSET、HDEL
    - Bitmaps
        - 用途：用位操作來處理字符串，適合狀態標記、計數統計等需求
        - 操作：SETBIT、GETBIT、BITCOUNT、BITOP


## 在系統設計中， Redis 常見的功用
1. 快取（Cache）
2. 分散式鎖（Distributed Lock）： 
3. 消息隊列（Message Queue）：Redis 的 List 結構可以作為簡單的消息隊列
4. 排行榜（Leaderboards）：Redis 的 Sorted Set 結構非常適合實現排行榜
5. Session 管理：TTL 功能提供高效、持久化的 session 管理


## Redis 的高性能
1. Redis 將數據存在 memory 中，速度遠快於磁碟 I/O 操作
2. Redis 使用單線程事件循環模型，減少上下文切換的開銷
    - 雖然是單線程，但 Redis 能夠通過非阻塞的 I/O 操作來處理多個客戶端請求
3. Redis 提供高效的資料結構（如字符串、列表、集合、哈希等）都是針對性能優化的
4. Redis 的操作指令（SET、GET）設計簡單明瞭，大多數操作都只需一次網路請求，減少延遲
5. Redis 提供多種持久化機制，如 RDB（快照）和 AOF（追加檔案）
6. Redis 支援管道（Pipeline）操作，允許客戶端一次性發送多個命令
7. Redis 使用簡單的通訊協議（RESP），可以有效地處理大量的請求
8. Redis 在內部使用的資料結構針對常見的操作進行了優化
9. Redis 支援分片和集群模式，多個 Redis 節點可以協同工作，以處理更高的請求量。