[TOC]html
REmote DIctionary Server(Redis) 是一個由 Salvatore Sanfilippo 寫的 key-value 存儲系統。node
Redis 是一個開源的使用 ANSI C 語言編寫、遵照 BSD 協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value 數據庫,並提供多種語言的 API。它一般被稱爲數據結構服務器,由於值(value)能夠是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等類型。從 2010 年 3 月 15 日起,Redis 的開發工做由 VMware 主持。從 2013 年 5 月開始,Redis 的開發由 Pivotal 贊助。mysql
Redis 默認端口linux
Redis 默認端口爲 6379,sentinel.conf 配置器端口爲 26379c++
# yum install gcc gcc-c++ -y
複製代碼
解壓
# tar xvf redis-4.0.10.tar.gz
進入 redis 目錄
# cd redis-4.0.10
編譯
# make PREFIX=/usr/local/redis MALLOC=libc(能夠不加,默認是 jemalloc) install
安裝
# make install
注意:Redis 並無本身實現內存池,沒有在標準的系統內存分配器上再加上本身的東西。
redis-2.4 以上自帶 jemalloc,你不須要加任何參數,經過 zmalloc.c 源碼中咱們能夠看到,Redis 在編譯時,會先判斷是否使用 tcmalloc,若是是,會用 tcmalloc 對應的函數替換掉標準的 libc 中的函數實現。其次會判斷jemalloc 是否使得,最後若是都沒有使用纔會用標準的 libc 中的內存管理函數。因此用 tcmalloc 優化請謹慎使用,這兩着分配器碎片率相差不大,建議用自帶 jemalloc。
複製代碼
redis 安裝後,在 /usr/local/redis/bin
下有幾個以 redis 開頭的可執行文件,稱爲 redis shell,這些可執行文件能夠作不少事情。redis
文件名稱 | 做用 |
---|---|
redis-server | 啓動 redis |
redis-cli | redis 命令行工具 |
redis-benchmark | 基準測試工具 |
redis-check-aof | AOF 持久化文件檢測工具和修復工具 |
redis-check-rdb | RDB 持久化文件檢測工具和修復工具 |
redis-sentinel | 啓動 redis-sentinel |
第一種方法:sql
# redis-server # 前臺啓動
# redis-server & # 後臺啓動
複製代碼
第二種方法:shell
修改 redis.conf 配置文件,從源碼目錄複製過來修改
# cp /usr/local/src/redis-4.0.10/redis.conf /usr/local/redis/
daemonize yes # 之後臺啓動 redis
requirepass redis123 # 設置 redis 登錄密碼
# bind 127.0.0.1 # 註釋此行
protected-mode no # 設置爲 no
logfile "/usr/local/redis/logs/redis.log" # 設置日誌文件
dir ./ # 數據目錄路徑
啓動服務
redis-server /usr/local/redis/redis.conf
複製代碼
配置文件詳解:數據庫
# 指定 redis 只接收來自於該 IP 地址的請求,若是不進行設置,那麼將處理全部請求,在生產環境中最好設置該項,若是隻綁定 127.0.0.1 的話,就只有本機可使用,外部沒法訪問;實際上,應該 bind 的是 redis所在服務器網卡的 ip。也就是說,若是你的 redis 服務器有兩張網卡,一張是 ip-1,另外一張是 ip-2,若是你 bind ip-1.那麼只有請求 ip-1 的請求會被受理。
bind 127.0.0.1 172.18.223.15
# redis 的一種安全機制,在這個機制開啓狀況下 protected-mode yes,若是你 bind 127.0.0.1 客戶端也是鏈接不上的。
# 在這個機制關閉狀況下 protected-mode no,若是你 bind 127.0.0.1 客戶端也是鏈接不上的,這個 bind 127.0.0.1 限定了 redis 只是監聽本地迴環的網絡請求。
# 若是是這樣的配置 bind 127.0.0.1 192.168.0.5 和 protected-mode no 局域網能夠鏈接;
# 若是是這樣的配置 bind 127.0.0.1 192.168.0.5 和 protected-mode yes 配置, 局域網也能夠鏈接;
# 綜上感受 protected-mode 參數配置感受沒什麼用。因此保留爲默認配置 protected-mode yes
protected-mode yes
# 監聽端口
port 63790
# TCP 最大鏈接數(這裏我改成和 linux 內核相同的值了,若是大型應用須要將內核的值修改到 2048 左右以應對更多的鏈接),默認是 511。
# 在 高請求/秒 的環境中,爲了不客戶端鏈接問題的緩慢,您須要大量的積壓。
# 請注意,Linux 內核將會悄悄地將其截斷爲 /proc/sys/net/core/somaxconn 的值,所以要確保提升somaxconn 和 tcpmaxsynbacklog 的值,以得到預期的效果。
tcp-backlog 128
# 設置最大客戶端鏈接數
maxclients 10000
# 表示客戶端空閒多長時間後關閉鏈接,如指定 0,表示該超時機制關閉。
timeout 0
tcp-keepalive 300
# 說明 redis 進程是後臺運行仍是前臺運行,yes 表示後臺運行,no 表示前臺運行
daemonize yes
# 設置訪問 redis 的口令
requirepass sfm@redis
supervised no
pidfile /mydata/redis/6379.pid
# 指定日誌記錄級別,指定日誌記錄級別,Redis 總共支持四個級別:debug、verbose、notice、warning,默認爲 notice
loglevel notice
logfile "/mydata/redis/logs/redis.log"
# redis 數據庫個數(默認 16 個)
databases 16
always-show-logo yes
# 900秒(15分鐘) 內有 1 條數據發生了變化,將數據 dump 到磁盤
save 900 1
# 300秒(5分鐘) 內有 10 條數據發生了變化,將數據 dump 到磁盤
save 300 10
# 69秒(1分鐘) 內有 10000 條數據發生了變化,將數據 dump 到磁盤
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
# 設置 RDB 持久化保存的文件名
dbfilename 6379.rdb
# 設置 RDB 持久化保存的路徑
dir /mydata/redis/
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
maxmemory-policy allkeys-lru
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
# 啓用 Append Only Mode 持久化文件
appendonly yes
# 設置 AOF 持久化文件名
appendfilename "6379.aof"
# fsync 持久化策略
appendfsync everysec
# AOF 重寫期間是否禁止 fsync;若是開啓該選項,能夠減輕文件重寫時 CPU 和硬盤的負載(尤爲是硬盤),可是可能會丟失 AOF 重寫期間的數據;須要在負載和安全性之間進行平衡
no-appendfsync-on-rewrite no
# AOF 文件重寫觸發條件之一
auto-aof-rewrite-percentage 100
# AOF 文件重寫觸發條件之一
auto-aof-rewrite-min-size 64mb
# 若是 AOF 文件結尾損壞,Redis 啓動時是否仍載入 AOF 文件
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
複製代碼
以 systemd 的方法來管理 redis 服務安全
新建 redis 用戶,不要以 root 用戶啓動 redis
# useradd -M -s /sbin/nologin redis
複製代碼
在 /usr/lib/systemd/system/ 目錄下新建 redis.service 文件,文件內容以下:
[Unit]
Description=Redis-4.0.10
# Documentation=man:mysqld(8)
# Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=redis
Group=redis
Type=forking
Restart=always
ExecStart=/usr/local/redis-4.0.10/bin/redis-server /usr/local/redis-4.0.10/redis.conf
ExecStop=/usr/local/redis-4.0.10/bin/redis-cli -h 127.0.0.1 -p 6379 -a redis123 shutdown
LimitNOFILE=65535
複製代碼
這樣就可使用 systemctl start | stop | status | restart redis.service 命令來管理 redis 服務了
注意:redis 使用的 data 目錄及 logs 目錄須要給 redis 權限
redis 的默認持久化策略是快照的方式
RDB 持久化配置
Redis 會將數據集的快照 dump 到 dump.rdb 文件中。此外,咱們也能夠經過配置文件來修改 Redis 服務器 dump 快照的頻率,在打開 redis.conf 文件以後,咱們搜索 save,能夠看到下面的配置信息:
save 900 1 # 在 900 秒(15分鐘)以後,若是至少有 1 個 key 發生變化,則 dump 內存快照。
save 300 10 # 在 300 秒(5分鐘)以後,若是至少有 10 個 key 發生變化,則 dump 內存快照。
save 60 10000 # 在 60 秒(1分鐘)以後,若是至少有 10000 個 key 發生變化,則 dump 內存快照。
複製代碼
默認 RDB 方式保存的是dump.rdb
文件,恢復也是識別的是dump.rdb
保存目錄也在配置文件中可配置,默認當前位置
# Note that you must specify a directory here, not a file name.
dir ./ # 默認 dump.rdb 文件保存位置
複製代碼
AOF 方式持久化配置
若是把
appendonly no 修改成
appendonly yes
複製代碼
則表示啓用 AOF 方式持久化(這種機制安全,保存的數據最爲健全,但要犧牲部分性能)
配置生成的 aof 文件名
appendfilename "appendonly.aof"
appendfsync everysec | always | no
# no 表示不執行 fsync,由操做系統保證數據同步到磁盤,速度最快。
# always 表示每次寫入都執行 fsync,以保證數據同步到磁盤。
# everysec 表示每秒執行一次 fsync,可能會致使丟失這 1 秒的數據。
appendfsync no
複製代碼
可使用兩種方式鏈接 redis 服務器。
第一種:交互式方式
# redis-cli -h {host} -p {port} ## 以這種方式鏈接,而後全部的操做都是在交互的方式實現,不須要再執行 redis-cli 了。
複製代碼
第二種:命令方式
# redis-cli -h {host} -p {port} {command} ## 直接獲得命令的返回結果。
複製代碼
命令方式經常使用參數:
參數 | 做用 | 用例 |
---|---|---|
-r | 表明將命令重複執行屢次 | $ redis-cli -r 3 ping # ping 命令可用於檢測 redis 實例是否存活,若是存活則顯示 PONG |
-i | 每隔幾秒(若是想用 ms,如 10ms 則寫成 0.01)執行一次命令,必須與 -r 一塊兒使用 |
$ redis-cli -r 10 -i 1 info | grep used_memory_human # 每隔 1 秒輸出內存的使用量,一共輸出 10 次。 |
-x | 表明從標準輸入讀取數據做爲該命令的最後一個參數。 | $ echo "world" |redis-cli -x set hello |
-c | 鏈接集羣結點時使用,此選項可防止 moved 和 ask 異常。 | |
-a | 如配置了密碼,可用 a 選項。 | $ redis-cli -a 123456 -r 10 -i 1 info | grep used_memory_human |
--rdb | 會請求 redis 實例生成併發送 RDB 持久化文件,保存在本地。可作按期備份。 |
一、查看服務器的信息和統計:info
2. 刪除全部數據庫內容:flushall
3. 刷新數據庫:flushdb
4. 看全部鍵:KEYS *,使用 select num 能夠查看鍵值數據。
5. 設置變量:set test "who am i"
6. config set dir dirpath 設置路徑等配置
7. config get dir/dbfilename 獲取路徑及數據庫配置信息
8. save 保存
9. get 變量,查看變量名稱
10. time:返回當前服務器時間
11. client list: 返回全部鏈接到服務器的客戶端信息和統計數據 參見http://redisdoc.com/server/client_list.html
12. client kill ip:port:關閉地址爲 ip:port 的客戶端
13. save:將數據同步保存到磁盤
14. bgsave:將數據異步保存到磁盤
15. lastsave:返回上次成功將數據保存到磁盤的Unix時戳
16. shundown:將數據同步保存到磁盤,而後關閉服務
17. config resetstat:重置info命令中的某些統計數據
18. config get:獲取配置文件信息
19. config set:動態地調整 Redis 服務器的配置(configuration)而無須重啓,能夠修改的配置參數可使用命令 CONFIG GET * 來列出
20. config rewrite:Redis 服務器時所指定的 redis.conf 文件進行改寫
21. monitor:實時轉儲收到的請求
22. slaveof:改變複製策略設置
複製代碼
一、master 的 redis 配置文件只須要設置好 bind、requirepass 等便可
二、slave 的 redis 配置文件中添加如下行:
slaveof x.x.x.x 6379 # Master 的 IP 地址及端口號
masterauth redis123 # 若是 Master 上設置有密碼的話,這裏須要設置跟 Master 上同樣的密碼
或者動態修改設置:
經過 redis-cli 鏈接到從節點服務器,執行下面命令便可。
slaveof x.x.x.x 6379
複製代碼