Redis 是一個高性能的 key-value 數據庫。node
SET 操做每秒鐘 110000 次;GET 操做每秒鐘 81000 次。linux
下載地址:github.com/MSOpenTech/…。c++
Redis 支持 32 位和 64 位。這個須要根據你係統平臺的實際狀況選擇,這裏咱們下載 Redis-x64-xxx.zip壓縮包到 C 盤,解壓後,將文件夾從新命名爲 redis。git
打開一個 cmd 窗口 使用 cd 命令切換目錄到 C:\redis 運行 redis-server.exe redis.windows.conf 。github
若是想方便的話,能夠把 redis 的路徑加到系統的環境變量裏,這樣就免得再輸路徑了,後面的那個 redis.windows.conf 能夠省略,若是省略,會啓用默認的。redis
這時候另啓一個 cmd 窗口,原來的不要關閉,否則就沒法訪問服務端了。算法
切換到 redis 目錄下運行 redis-cli.exe -h 127.0.0.1 -p 6379 。數據庫
下載地址: redis.io/download,下載…windows
下載、解壓、編譯 Redis緩存
$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz
$ tar xzf redis-5.0.4.tar.gz
$ cd redis-5.0.4
$ make
複製代碼
爲了編譯 Redis 源碼,你須要 gcc-c++和 tcl。若是你的系統是 CentOS,能夠直接執行命令:yum install -y gcc-c++ tcl
來安裝。
進入到解壓後的 src
目錄,經過以下命令啓動 Redis:
$ src/redis-server
複製代碼
您可使用內置的客戶端與 Redis 進行交互:
$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
複製代碼
在 Ubuntu 系統安裝 Redi 可使用如下命令:
$sudo apt-get update
$sudo apt-get install redis-server
複製代碼
echo "/usr/local/bin/redis-server /etc/redis.conf" >> /etc/rc.local
iptables -I INPUT -p tcp -m tcp --dport 6379 -j ACCEPT
service iptables save
service iptables restart
啓動 redis 服務
cd /opt/redis/redis-5.0.4/src
./redis-server
複製代碼
啓動 redis 客戶端
cd /opt/redis/redis-5.0.4/src
./redis-cli
複製代碼
查看 redis 是否啓動
$ redis-cli
複製代碼
以上命令將打開如下終端:
redis 127.0.0.1:6379>
複製代碼
127.0.0.1 是本機 IP ,6379 是 redis 服務端口。如今咱們輸入 PING 命令。
redis 127.0.0.1:6379> ping
PONG
複製代碼
以上說明咱們已經成功啓動了 redis。
Redis 默認的配置文件是根目錄下的
redis.conf
文件。若是須要指定特定文件做爲配置文件,須要使用命令:
./redis-server -c xxx.conf
每次修改配置後,須要重啓才能生效。
Redis 官方默認配置:
- 自描述文檔 redis.conf for Redis 2.8
- 自描述文檔 redis.conf for Redis 2.6.
- 自描述文檔 redis.conf for Redis 2.4.
自 Redis2.6 起就能夠直接經過命令行傳遞 Redis 配置參數。這種方法能夠用於測試。自 Redis2.6 起就能夠直接經過命令行傳遞 Redis 配置參數。這種方法能夠用於測試。
Redis 默認以非守護進程方式啓動,而一般咱們會將 Redis 設爲守護進程啓動方式,配置:daemonize yes
Redis 默認綁定 127.0.0.1,這樣就只能本機才能訪問,若要 Redis 容許遠程訪問,須要配置:bind 0.0.0.0
Redis 默認訪問不須要密碼,若是須要設置密碼,須要以下配置:
protected-mode yes
requirepass <密碼>
配置項 | 說明 |
---|---|
daemonize no |
Redis 默認不是以守護進程的方式運行,能夠經過該配置項修改,使用 yes 啓用守護進程(Windows 不支持守護線程的配置爲 no ) |
pidfile /var/run/redis.pid |
當 Redis 以守護進程方式運行時,Redis 默認會把 pid 寫入 /var/run/redis.pid 文件,能夠經過 pidfile 指定 |
port 6379 |
指定 Redis 監聽端口,默認端口爲 6379,做者在本身的一篇博文中解釋了爲何選用 6379 做爲默認端口,由於 6379 在手機按鍵上 MERZ 對應的號碼,而 MERZ 取自意大利歌女 Alessia Merz 的名字 |
bind 127.0.0.1 |
綁定的主機地址 |
timeout 300 |
當客戶端閒置多長時間後關閉鏈接,若是指定爲 0,表示關閉該功能 |
loglevel notice |
指定日誌記錄級別,Redis 總共支持四個級別:debug、verbose、notice、warning,默認爲 notice |
logfile stdout |
日誌記錄方式,默認爲標準輸出,若是配置 Redis 爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給 /dev/null |
databases 16 |
設置數據庫的數量,默認數據庫爲 0,可使用 SELECT 命令在鏈接上指定數據庫 id |
save <seconds> <changes> Redis 默認配置文件中提供了三個條件:save 900 1、save 300 10、save 60 10000 分別表示 900 秒(15 分鐘)內有 1 個更改,300 秒(5 分鐘)內有 10 個更改以及 60 秒內有 10000 個更改。 |
指定在多長時間內,有多少次更新操做,就將數據同步到數據文件,能夠多個條件配合 |
rdbcompression yes |
指定存儲至本地數據庫時是否壓縮數據,默認爲 yes,Redis 採用 LZF 壓縮,若是爲了節省 CPU 時間,能夠關閉該選項,但會致使數據庫文件變的巨大 |
dbfilename dump.rdb |
指定本地數據庫文件名,默認值爲 dump.rdb |
dir ./ |
指定本地數據庫存放目錄 |
slaveof <masterip> <masterport> |
設置當本機爲 slav 服務時,設置 master 服務的 IP 地址及端口,在 Redis 啓動時,它會自動從 master 進行數據同步 |
masterauth <master-password> |
當 master 服務設置了密碼保護時,slav 服務鏈接 master 的密碼 |
requirepass foobared |
設置 Redis 鏈接密碼,若是配置了鏈接密碼,客戶端在鏈接 Redis 時須要經過 AUTH 命令提供密碼,默認關閉 |
maxclients 128 |
設置同一時間最大客戶端鏈接數,默認無限制,Redis 能夠同時打開的客戶端鏈接數爲 Redis 進程能夠打開的最大文件描述符數,若是設置 maxclients 0,表示不做限制。當客戶端鏈接數到達限制時,Redis 會關閉新的鏈接並向客戶端返回 max number of clients reached 錯誤信息 |
maxmemory <bytes> |
指定 Redis 最大內存限制,Redis 在啓動時會把數據加載到內存中,達到最大內存後,Redis 會先嚐試清除已到期或即將到期的 Key,當此方法處理 後,仍然到達最大內存設置,將沒法再進行寫入操做,但仍然能夠進行讀取操做。Redis 新的 vm 機制,會把 Key 存放內存,Value 會存放在 swap 區 |
appendonly no |
指定是否在每次更新操做後進行日誌記錄,Redis 在默認狀況下是異步的把數據寫入磁盤,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於 redis 自己同步數據文件是按上面 save 條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認爲 no |
appendfilename appendonly.aof |
指定更新日誌文件名,默認爲 appendonly.aof |
appendfsync everysec |
指定更新日誌條件,共有 3 個可選值:no:表示等操做系統進行數據緩存同步到磁盤(快)always:表示每次更新操做後手動調用 fsync() 將數據寫到磁盤(慢,安全)everysec:表示每秒同步一次(折中,默認值) |
vm-enabled no |
指定是否啓用虛擬內存機制,默認值爲 no,簡單的介紹一下,VM 機制將數據分頁存放,由 Redis 將訪問量較少的頁即冷數據 swap 到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在後面的文章我會仔細分析 Redis 的 VM 機制) |
vm-swap-file /tmp/redis.swap |
虛擬內存文件路徑,默認值爲 /tmp/redis.swap,不可多個 Redis 實例共享 |
vm-max-memory 0 |
將全部大於 vm-max-memory 的數據存入虛擬內存,不管 vm-max-memory 設置多小,全部索引數據都是內存存儲的(Redis 的索引數據 就是 keys),也就是說,當 vm-max-memory 設置爲 0 的時候,實際上是全部 value 都存在於磁盤。默認值爲 0 |
vm-page-size 32 |
Redis swap 文件分紅了不少的 page,一個對象能夠保存在多個 page 上面,但一個 page 上不能被多個對象共享,vm-page-size 是要根據存儲的 數據大小來設定的,做者建議若是存儲不少小對象,page 大小最好設置爲 32 或者 64bytes;若是存儲很大大對象,則可使用更大的 page,若是不肯定,就使用默認值 |
vm-pages 134217728 |
設置 swap 文件中的 page 數量,因爲頁表(一種表示頁面空閒或使用的 bitmap)是在放在內存中的,,在磁盤上每 8 個 pages 將消耗 1byte 的內存。 |
vm-max-threads 4 |
設置訪問 swap 文件的線程數,最好不要超過機器的核數,若是設置爲 0,那麼全部對 swap 文件的操做都是串行的,可能會形成比較長時間的延遲。默認值爲 4 |
glueoutputbuf yes |
設置在向客戶端應答時,是否把較小的包合併爲一個包發送,默認爲開啓 |
hash-max-zipmap-entries 64 hash-max-zipmap-value 512 |
指定在超過必定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希算法 |
activerehashing yes |
指定是否激活重置哈希,默認爲開啓(後面在介紹 Redis 的哈希算法時具體介紹) |
include /path/to/local.conf |
指定包含其它的配置文件,能夠在同一主機上多個 Redis 實例之間使用同一份配置文件,而同時各個實例又擁有本身的特定配置文件 |
Redis 3.0 後支持集羣模式。
Redis
集羣通常由 多個節點 組成,節點數量至少爲 6
個,才能保證組成 完整高可用 的集羣。
理想狀況固然是全部節點各自在不一樣的機器上,首先於資源,本人在部署 Redis 集羣時,只獲得 3 臺服務器。因此,我計劃每臺服務器部署 2 個 Redis 節點。
Redis 集羣節點的安裝與單節點服務相同,差別僅在於部署方式。
假設三臺服務器地址以下:
分配以下:
127.0.0.1 | 127.0.0.2 | 127.0.0.3 |
---|---|---|
127.0.0.1:6381 | 127.0.0.2:6383 | 127.0.0.3:6385 |
127.0.0.1:6382 | 127.0.0.2:6384 | 127.0.0.3:6386 |
我我的偏好將軟件放在 /opt
目錄下,在個人機器中,Redis 都安裝在 /opt/redis/redis-5.0.4
目錄下。因此,下面的命令和配置都假設 Redis 安裝目錄爲 /opt/redis/redis-5.0.4
。
確保機器上已經安裝了 Redis 後,執行如下命令,建立 Redis 集羣節點實例目錄:
sudo mkdir -p /opt/redis/redis-5.0.4/cluster/6381
sudo mkdir -p /opt/redis/redis-5.0.4/cluster/6382
複製代碼
sudo mkdir -p /opt/redis/redis-5.0.4/cluster/6383
sudo mkdir -p /opt/redis/redis-5.0.4/cluster/6384
複製代碼
sudo mkdir -p /opt/redis/redis-5.0.4/cluster/6385
sudo mkdir -p /opt/redis/redis-5.0.4/cluster/6386
複製代碼
每一個實例目錄下,新建 redis.conf
配置文件。
實例配置模板以 6381 節點爲例(其餘節點,徹底替換配置中的端口號 6381 便可),以下:
# 端口號
port 6381
# 綁定的主機端口(0.0.0.0 表示容許遠程訪問)
bind 0.0.0.0
# 以守護進程方式啓動
daemonize yes
# 開啓集羣模式
cluster-enabled yes
# 集羣的配置,配置文件首次啓動自動生成
cluster-config-file /opt/redis/redis-5.0.4/cluster/6381/6381.conf
# 請求超時時間,設置 10 秒
cluster-node-timeout 10000
# 開啓 AOF 持久化
appendonly yes
# 數據存放目錄
dir /opt/redis/redis-5.0.4/cluster/6381
# 進程文件
pidfile /var/run/redis-cluster/redis-6381.pid
# 日誌文件
logfile /opt/redis/redis-5.0.4/cluster/6381/6381.log
複製代碼
Redis 的 utils/create-cluster 目錄下自帶了一個名爲 create-cluster 的腳本工具,能夠利用它來新建、啓動、中止、重啓 Redis 節點。
腳本中有幾個關鍵參數:
PORT
=30000 - 初始端口號TIMEOUT
=2000 - 超時時間NODES
=6 - 節點數REPLICAS
=1 - 備份數腳本中的每一個命令項會根據初始端口號,以及設置的節點數,遍歷的去執行操做。
因爲前面的規劃中,節點端口是從 6381 ~ 6386,因此須要將 PORT 變量設爲 6380。
腳本中啓動每一個 Redis 節點是經過指定命令行參數來配置屬性。因此,咱們須要改一下:
if [ "$1" == "start" ]
then
while [ $((PORT < ENDPORT)) != "0" ]; do
PORT=$((PORT+1))
echo "Starting $PORT"
/opt/redis/redis-5.0.4/src/redis-server /opt/redis/redis-5.0.4/cluster/${PORT}/redis.conf
done
exit 0
fi
複製代碼
好了,在每臺服務器上,都執行 ./create-cluster start
來啓動節點。
而後,經過 ps 命令來確認 Redis 進程是否已經工做:
$ ps -ef | grep redis
root 12036 1 12 16:26 ? 00:08:28 /opt/redis/redis-5.0.4/src/redis-server 0.0.0.0:6381 [cluster]
root 12038 1 0 16:26 ? 00:00:03 /opt/redis/redis-5.0.4/src/redis-server 0.0.0.0:6382 [cluster]
複製代碼
經過 redis-cli --cluster create
命令能夠自動配置集羣,以下:
$ /opt/redis/redis-5.0.4/src/redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.2:6383 127.0.0.2:6384 127.0.0.3:6385 127.0.0.3:6386 --cluster-replicas 1
複製代碼
若是啓動成功,能夠看到以下信息:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.2:6384 to 127.0.0.1:6381
Adding replica 127.0.0.3:6386 to 127.0.0.2:6383
Adding replica 127.0.0.1:6382 to 127.0.0.3:6385
M: 75527b790e46530ea271a5b78f9e0fd9030f68e0 127.0.0.1:6381
slots:[0-5460] (5461 slots) master
S: 031dd0fd5ad90fa26fcf45d49ad906d063611a6d 127.0.0.1:6382
replicates 53012ebdd25005840da9ecbe07d937296a264206
M: 0cfbceec272b6ff70e1dfb5c5346a5cb2c20c884 127.0.0.2:6383
slots:[5461-10922] (5462 slots) master
S: 016ae9624202891cc6f2b480ff0634de478197fb 127.0.0.2:6384
replicates 75527b790e46530ea271a5b78f9e0fd9030f68e0
M: 53012ebdd25005840da9ecbe07d937296a264206 127.0.0.3:6385
slots:[10923-16383] (5461 slots) master
S: b6d70f2ed78922b1dcb7967ebe1d05ad9157fca8 127.0.0.3:6386
replicates 0cfbceec272b6ff70e1dfb5c5346a5cb2c20c884
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 127.0.0.1:6381)
M: 75527b790e46530ea271a5b78f9e0fd9030f68e0 127.0.0.1:6381
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 0cfbceec272b6ff70e1dfb5c5346a5cb2c20c884 127.0.0.2:6383
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 016ae9624202891cc6f2b480ff0634de478197fb 127.0.0.2:6384
slots: (0 slots) slave
replicates 75527b790e46530ea271a5b78f9e0fd9030f68e0
M: 53012ebdd25005840da9ecbe07d937296a264206 127.0.0.3:6385
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 031dd0fd5ad90fa26fcf45d49ad906d063611a6d 127.0.0.1:6382
slots: (0 slots) slave
replicates 53012ebdd25005840da9ecbe07d937296a264206
S: b6d70f2ed78922b1dcb7967ebe1d05ad9157fca8 127.0.0.3:6386
slots: (0 slots) slave
replicates 0cfbceec272b6ff70e1dfb5c5346a5cb2c20c884
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
複製代碼
./create-cluster stop
./redis-cli --cluster check <ip:port>
./redis-cli --cluster fix <ip:port>
命令詳細用法,請參考 Redis 命令官方文檔
搬遷兩張 cheat sheet 圖,原址:www.cheatography.com/tasjaevan/c…
參考官方文檔:How fast is Redis?
Redis 自帶了一個性能測試工具:redis-benchmark
(1)基本測試
$ redis-benchmark -q -n 100000
複製代碼
-q
表示靜默(quiet)執行-n 100000
請求 10 萬次(2)測試指定讀寫指令
$ redis-benchmark -t set,lpush -n 100000 -q
SET: 74239.05 requests per second
LPUSH: 79239.30 requests per second
複製代碼
(3)測試 pipeline 模式下指定讀寫指令
redis-benchmark -n 1000000 -t set,get -P 16 -q
SET: 403063.28 requests per second
GET: 508388.41 requests per second
複製代碼
推薦使用 RedisDesktopManager
若是想傻瓜式安裝一個 Redis 單節點服務,可使用個人 安裝腳本