0%

[Redis] Redis 安裝及使用

Redis

簡介

Redis 是一個由 Salvatore Sanfilippo 開發,以 ANSI C 編寫的開源、In-memory 的 Key-value database, 常被用在需要做快取的地方,以減輕後端伺服器的 loading.

特色

  • In-memory data structure store
  • 以 Key-value 形式儲存資料
  • 支援多種資料型態:
    • String
    • Hash
    • List
    • Set
    • Sorted set (有序集合)
  • Persistence
    • 可以每隔一段時間,把資料儲存到disk,或者增加每條命令到log檔來持久化(persistence).
  • 支援主從式的非同步複製
    • 資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。
    • 它是 non-blocking 的,在同步資料的同時,master 也可以繼續做其他事。
  • Transactions
    • 可以保證一串命令,中間不會被任何操作打斷。
    • 保證一個 client 發起的 Transactions 中的命令可以連續的執行,而中間不會插入其他 client 的命令。
  • Publish/Subscribe
  • 支援 Lua scripting
  • 可以設定 Key expire time.
  • 支援LRU演算法來替換掉舊的key值
  • Automatic failover
    • 當 master 發生問題,Sentinel 會自動啟動 failover 程序,其中一個 slave 會提升為 master,其他的 slaves 會重新設定,以使用新的 master.

資料型態

Redis 提供的資料型態有: String, List, Hash, Set and Sorted set, 接下來將分別介紹一下每個型態。

String

  • String 是 Redis 中的基本型態,他是 Binary safe, 也就是說可以包含任何數據,像是 jpg 圖檔。
  • String 最大的長度限制為 512 MB.

List

  • Redis 的 List 是簡單的字串列表,依照插入的順序排序,在插入時可以選擇要插入到 head (left) 或 tail (right).
  • List 最大的長度限制是232 - 1 (超過40億個元素).

Hash

  • Redis 的 Hash 是 String 類型的 field & value 的 mapping, 適合用來儲存 object.
  • 每個 Hash 可以儲存 232 - 1 個 field-value pairs. (超過40億)

Set

  • Redis 的 Set 是沒有順序的字串集合。
  • 集合是透過 Hash table 來實現,不論集合中的元素有多少,新增、移除、檢查元素是否存在的時間複雜度都是 O(1).
  • Redis 的 Set 不允許重複的元素,多次增加同一個元素到集合中,也只會有一個元素存在集合中,所以在加入時不需要特別檢查元素是否存在。
  • 支援很多 Server side 指令,可以在短時間內計算多個集合的交集、並集或差集。
  • 每個集合的元素最大限制是 232 - 1.

Sorted set

  • Sorted set 和 Set 很像,一樣不允許有重複的元素。
  • 不同的是,Sorted set 中的元素都有一個關聯的 score, 排序是依照 score 高低,雖然元素是唯一的,但分數可以重複。
  • 由於元素是有序的,可以透過分數或者排名(位置) 很快地取得一個範圍內的元素。

安裝

作業系統支援 Linux, OSX, OpenBSD, NetBSD, FreeBSD.

  • 下載, 解壓縮 and compile

    1
    2
    3
    4
    $ wget http://download.redis.io/releases/redis-4.0.7.tar.gz
    $ tar zxvf redis-4.0.7.tar.gz
    $ cd redis-4.0.7/
    $ make
  • 設定 redis.conf

    1
    2
    3
    4
    5
    6
    7
    8
    # port
    port <port>

    # 綁定IP
    bind 127.0.0.1 <IP>

    # 設定密碼
    requirepass <pwd>
  • 執行並使用自訂設定檔

    1
    $ ./src/redis-server redis.conf

開始使用 Redis

Connect to Redis server

Via Redis-cli

1
$ ./src/redis-cli [-h <host>] [-p <port>] [-a <password>]

Via Node.js

  • 安裝 node_redis

    1
    $ npm install redis
  • 使用範例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    const redis = require('redis');
    const config = require('./config');
    const opts = {auth_pass:conf.pwd};

    let client = redis.createClient(config.port, config.host, opts);

    // error handler
    client.on('error', (err) => {
    console.log('Error: ' + err);
    });

    client.llen('urlQueue', (err, result) => {
    console.log(result);
    client.quit();
    });

Via Python

  • 安裝 redis-py

    1
    pip install redis
  • 使用範例

    1
    2
    3
    4
    5
    6
    client = redis.Redis(
    host = settings['REDIS_SERVER'],
    port = settings['REDIS_PORT'],
    password = settings['REDIS_PWD']
    )
    item = client.blpop(key, timeout=timeout)

Usage

連線到 Redis server 之後,就可以依照需求來選擇不同的資料型態,並且進行不同的指令操作,由於指令非常多,這裡就不多作介紹,相關的指令文件可以參考:

參考資料