簡介
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
15const 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
6client = redis.Redis(
host = settings['REDIS_SERVER'],
port = settings['REDIS_PORT'],
password = settings['REDIS_PWD']
)
item = client.blpop(key, timeout=timeout)
Usage
連線到 Redis server 之後,就可以依照需求來選擇不同的資料型態,並且進行不同的指令操作,由於指令非常多,這裡就不多作介紹,相關的指令文件可以參考:
- Command line: Redis commands
- Node.js: node_redis
- Python: redis-py
- 其他語言可以參考: Redis clients