10分鐘快速入門Redis

這裏持續更新修正,我會吧我使用過程當中,遇到的一些問題記錄下來html

Redis安裝

官方編譯安裝

$ wget http://download.redis.io/releases/redis-4.0.0.tar.gz
$ tar xzvf redis-4.0.0.tar.gz -C /usr/local/
$ cd /usr/local/redis-4.0.0
$ make
$ make test
$ make install 
# 程序會自動執行:
# mkdir -p /usr/local/bin
# cp -pf redis-server /usr/local/bin
# cp -pf redis-benchmark /usr/local/bin
# cp -pf redis-cli /usr/local/bin
# cp -pf redis-check-dump /usr/local/bin
# cp -pf redis-check-aof /usr/local/bin

測試make test報錯node

$ make test
You need tcl 8.5 or newer in order to run the Redis test
make: *** [test] Error 1

這個是須要安裝tclmysql

wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz  
sudo tar xzvf tcl8.6.1-src.tar.gz  -C /usr/local/  
cd  /usr/local/tcl8.6.1/unix/  
sudo ./configure  
sudo make  
sudo make install

經過EPEL源安裝

源安裝問題在於不能安裝最新,或者指定Redis版本。linux

yum --enablerepo=epel -y install redis

若是沒有安裝源,經過下面方式安裝源。git

cd /etc/yum.repos.d/
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Redis升級

首先,確保安裝瞭如下repos,EPEL和REMI:github

sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-6.rpm

經過--enablerepo=epel參數查看指定源Redis版本,檢查REMI repo中的Redis版本:redis

yum --enablerepo=epel info redis
# Loaded plugins: fastestmirror
# Loading mirror speeds from cached hostfile
#  * base: centos.ustc.edu.cn
#  * epel: mirrors.tuna.tsinghua.edu.cn
#  * extras: centos.ustc.edu.cn
#  * updates: mirrors.zju.edu.cn
# Available Packages
# Name        : redis
# Arch        : x86_64
# Version     : 2.4.10
# Release     : 1.el6
# Size        : 213 k
# Repo        : epel/x86_64
# Summary     : A persistent key-value database
# URL         : http://redis.io
# License     : BSD
# Description : Redis is an advanced key-value store. It is similar to memcached but the data
#             : set is not volatile, and values can be strings, exactly like in memcached, but
#             : also lists, sets, and ordered sets. All this data types can be manipulated with
#             : atomic operations to push/pop elements, add/remove elements, perform server
#             : side union, intersection, difference between sets, and so forth. Redis supports
#             : different kind of sorting abilities.

而後從EPEL repo安裝相關的依賴關係(jemalloc):算法

yum --enablerepo=epel install jemalloc

在安裝以前,您應該中止舊的Redis守護進程:sql

service redis stop

而後安裝更新版本的Redis:mongodb

sudo yum --enablerepo=remi install redis

服務管理

從新啓動Redis守護程序,並使其從新啓動時自動啓動:

sudo service redis start
sudo chkconfig redis on

基本服務操做

## 啓動並後臺運行
$ redis-server & nohup
## 查是否啓動
$ redis-cli ping
## 關閉命令
$ redis-cli shutdown

# 命令行客戶端啓動
$ redis-cli start
# 啓動
$ service redis start
# 中止
$ service redis stop

# 命令行客戶端啓動
$ redis-cli -p 6380

# 指定端口後臺啓動
$ redis-server --port 6380 &

查看版本

檢查當前安裝的Redis版本:

# 查看 Redis 版本
$ redis-cli info | grep redis_version

# 查看端口號
$ redis-cli info | grep tcp_port

開機啓動

咱們將在 Redis 安裝目錄找到/usr/local/redis-4.0.0/utils這個目錄,在這個目錄中有個有個腳本 redis_init_script,將此腳本拷貝到/etc/init.d目錄下,命名爲redis:

cp /usr/local/redis-4.0.0/utils/redis_init_script /etc/init.d/redis

拷貝一下redis.conf 文件到/etc/redis目錄下

cp /usr/local/redis-4.0.0/redis.conf /etc/redis/6380.conf

配置文件6380.conf須要更改幾個地方

# 是否在後臺執行,yes:後臺運行;no:不是後臺運行(老版本默認)
daemonize yes

更改權限,經過 chkconfig 命令檢查、設置系統redis服務開啓

chmod +x /etc/init.d/redis
chkconfig redis on

必須把下面兩行註釋放在 /etc/init.d/redis 文件頭部,不設置會報不支持的提示 service redis does not support chkconfig

# chkconfig:   2345 90 10
# description:  redis is a persistent key-value database

上面的註釋的意思是,redis服務必須在運行級2,3,4,5下被啓動或關閉,啓動的優先級是90,關閉的優先級是10。

Redis 啓動警告錯誤解決

  1. WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
echo "vm.overcommit_memory=1" > /etc/sysctl.conf  # 或 vi /etcsysctl.conf , 而後reboot重啓機器
echo 1 > /proc/sys/vm/overcommit_memory  # 不須要啓機器就生效
  1. WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
echo 511 > /proc/sys/net/core/somaxconn

更改配置

Redis 的配置文件位於 Redis 安裝目錄下,文件名爲 redis.conf。默認 Redis 配置文件在 sudo vi /etc/redis.conf 這裏能夠編輯

sudo vi /etc/redis.conf

你能夠經過 CONFIG 命令查看或設置配置項。配置設置命令

## 進入redis獲取
127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
## 進入redis設置
127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

## 獲取全部配置
127.0.0.1:6379> CONFIG GET *

## 設置配置開啓通知功能
$ redis-cli config set notify-keyspace-events KEA

基本操做

## 命令行客戶端啓動
$ redis-cli

# 測試心跳
127.0.0.1:6379> ping
PONG

# 設置 mykey 鍵的值
127.0.0.1:6379> set mykey hello
OK

# 獲取 mykey 鍵的值
127.0.0.1:6379> get mykey
"hello"

## 設置 mykey 失效事件
127.0.0.1:6379> expire mykey 2


# 查看當前redis的配置信息
127.0.0.1:6379> config get *

# 獲取全部的key
127.0.0.1:6379> keys *

# 刪除redis當前數據庫中的全部Key
127.0.0.1:6379> flushdb

127.0.0.1:6379> config get dir

# 饞哭當前庫 key 的數量
127.0.0.1:6379> dbsize

# 刪除全部數據庫中的key
127.0.0.1:6379> flushall

# 退出
127.0.0.1:6379> exit


# 找出拖慢 Redis 的罪魁禍首
# 經過這個工具能夠查看全部命令統計的快照,
# 好比命令執行了多少次,
# 執行命令所耗費的毫秒數(每一個命令的總時間和平均時間)
# 只須要簡單地執行 CONFIG RESETSTAT 命令就能夠重置,這樣你就能夠獲得一個全新的統計結果。

127.0.0.1:6379> commandstats
cmdstat_get:calls=78,usec=608,usec_per_call=7.79
cmdstat_setex:calls=5,usec=71,usec_per_call=14.20
cmdstat_keys:calls=2,usec=42,usec_per_call=21.00
cmdstat_info:calls=10,usec=1931,usec_per_call=193.10

支持的數據類型

字符串

# 啓動客戶端 ,存儲字符串到redis.
redis> SET name forezp
OK
# 取字符串:
redis> get name 
"forezp"

Hashes - 哈希值

redis > HMSET king username forezp password xxdxx age 22
redis > HGETALL king
1) "username"
2) "forezp "
3) "password "
4) "xxdxx "
5) "age "
6) "22"

Lists - 列表

redis> lpush pricess kenny
(integer) 1
redis 127.0.0.1:6379> lpush pricess jolin
(integer) 2
redis 127.0.0.1:6379> lpush pricess mayun
(integer) 3
redis 127.0.0.1:6379> lrange pricess 0 10
1) "kenny"
2) "jolin"
3) "mayun"

有序集合

redis > ZADD kindom 1 redis
(integer) 1
redis> ZADD kindom 2 mongodb
(integer) 1
redis > ZADD kindom 3 mysql
(integer) 1
redis > ZADD kindom 3 mysql
(integer) 0
redis > ZADD kindom 4 mysql
(integer) 0
redis > ZRANGE kindom 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"

開啓通知

鍵空間事件通知默認被禁用,由於這個特性消耗CPU電量不是很明智。使用redis.confnotify-keyspace-events,或者經過CONFIG SET來開啓通知。

## 設置配置開啓通知功能
$ redis-cli config set notify-keyspace-events KEA
## 命令行監控全部通知
$ redis-cli --csv psubscribe '__key*__:*'
Reading messages... (press Ctrl-C to quit)
"psubscribe","__key*__:*",1

鍵值說明

K     Keyspace events, published with __keyspace@<db>__ prefix.  
E     Keyevent events, published with __keyevent@<db>__ prefix.  
g     Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...  
$     String commands  
l     List commands  
s     Set commands  
h     Hash commands  
z     Sorted set commands  
x     Expired events (events generated every time a key expires)  
e     Evicted events (events generated when a key is evicted for maxmemory)  
A     Alias for g$lshzxe, so that the "AKE" string means all the events.

不一樣命令產生的事件(Events generated by different commands)

按照下面的清單,不一樣的命令產生不一樣類型的事件。 Redis Keyspace Notifications

  • DEL 爲每個被刪除的鍵產生一個del事件。
  • RENAME 產生兩個事件,爲源鍵產生一個rename_from事件,爲目標鍵產生一個rename_to事件。
  • EXPIRE 當爲鍵設置過時時產生一個expire事件,或者每當設置了過時的鍵被刪除時產生一個expired事件(查看EXPIRE文檔獲取更多信息)。
  • SORT 當STORE用於設置一個新鍵時產生一個sortstore事件。當結果列表爲空,而且使用了STORE選項,而且已經有一個該名字的鍵存在,那麼這個件鍵被刪除,因此這種條件下或產生一個del事件。
  • SET及其全部變種(SETEX, SETNX,GETSET) 產生set事件。可是SETEX還會產生一個expire事件。
  • MSET 爲每一個鍵產生一個單獨的set事件。
  • SETRANGE 產生一個setrange事件。
  • INCR, DECR, INCRBY, DECRBY 都產生incrby事件。
  • INCRBYFLOAT 產生一個incrbyfloat事件。
  • APPEND 產生一個append事件。
  • LPUSH和LPUSHX 產生單個lpush事件,即便在可變狀況下(even in the variadic case)。
  • RPUSH和RPUSHX 產生單個rpush事件,即便在可變狀況下(even in the variadic case)。
  • RPOP 產生一個rpop事件。若是鍵因爲最後一個元素被從列表中彈出而致使刪除,會又產生一個del事件。
  • LPOP 產生一個lpop事件。若是鍵因爲最後一個元素被從列表中彈出而致使刪除,會又產生一個del事件。
  • LINSERT 產生一個linsert事件。
  • LSET 產生一個lset事件。
  • LREM 產生一個lrem事件。若是結果列表爲空而且鍵被刪除,會又產生一個del事件。
  • LTRIM 產生一個ltrim事件。若是結果列表爲空而且鍵被刪除,會又產生一個del事件。
  • RPOPLPUSH和BRPOPLPUSH 產生一個rpop事件和一個lpush事件。兩種狀況下順序都能保證 (lpush事件老是在rpop事件以後被傳遞) 若是結果列表長度爲零而且鍵被刪除,會又產生一個del事件。
  • HSET, HSETNX和HMSET 都產生單個hset事件。
  • HINCRBY 產生一個hincrby事件。
  • HINCRBYFLOAT 產生一個hincrbyfloat事件。
  • HDEL 產生單個hdel事件。若是結果哈希爲空而且鍵被刪除,會又產生一個del事件。
  • SADD 產生單個sadd事件,即便在可變狀況下(even in the variadic case)。
  • SREM 產生單個srem事件。若是結果集合爲空而且鍵被刪除,會又產生一個del事件。
  • SMOVE 爲源鍵產生一個srem事件爲目標鍵產生一個sadd事件。
  • SPOP 產生一個spop事件。若是結果集合爲空而且鍵被刪除,會又產生一個del事件。
  • SINTERSTORE, SUNIONSTORE, SDIFFSTORE 分別產生sinterstore,sunionostore,sdiffstore事件。在特殊狀況下,集合爲空,且存儲結果的鍵已經存在,因爲鍵被刪除,會產生一個del事件。
  • ZINCR 產生一個zincr事件。
  • ZADD產生單個zadd事件,即便添加了多個元素。.
  • ZREM 產生單個zrem事件,即便刪除了多個元素。當結果有序集合爲空,而且鍵被生成時,會產生一個額外的del事件。
  • ZREMBYSCORE 產生單個zrembyscore事件。當結果有序集合爲空,而且鍵被生成時,會產生一個額外的del事件。
  • ZREMBYRANK 產生單個zrembyrank事件。當結果有序集合爲空,而且鍵被生成時,會產生一個額外的del事件。
  • ZINTERSTORE和ZUNIONSTORE 分別產生zinterstore和zunionstore事件。在特殊狀況下,集合爲空,且存儲結果的鍵已經存在,因爲鍵被刪除,會產生一個del事件。
  • 每當一個關聯有生存事件的鍵因爲過時而被從數據集中刪除時會產生一個expired事件。
  • 每當一個鍵因爲maxmemory策略而從數據集中被淘汰以節省內存時會產生一個evicted事件。

開啓遠程登陸鏈接

使用 netstat 來查看端口占用狀況,6379爲默認Redis端口。

netstat -nlt|grep 6379
  • -t:指明顯示 TCP 端口
  • -u:指明顯示 UDP 端口
  • -l:僅顯示監聽套接字
  • -p:顯示進程標識符和程序名稱,每個套接字/端口都屬於一個程序。
  • -n:不進行 DNS 輪詢,顯示 IP (能夠加速操做)

修改防火牆配置

修改防火牆配置 sudo vi /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT

修改配置文件

Redis protected-mode 是3.2 以後加入的新特性,在Redis.conf的註釋中,咱們能夠了解到,他的具體做用和啓用條件。能夠在 sudo vi /etc/redis.conf 中編輯,修改配置文件。

# Protected mode is a layer of security protection, in order to avoid that
# Redis instances left open on the internet are accessed and exploited.
#
# When protected mode is on and if:
#
# 1) The server is not binding explicitly to a set of addresses using the
#    "bind" directive.
# 2) No password is configured.
#
# The server only accepts connections from clients connecting from the
# IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain
# sockets.
#
# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Redis
# even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive.
protected-mode yes

它啓用的條件,有兩個:

  1. 沒有bind IP
  2. 沒有設置訪問密碼

若是啓用了,則只可以經過lookback ip(127.0.0.1)訪問Redis cache,若是從外網訪問,則會返回相應的錯誤信息:

(error) DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the lookback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the --portected-mode no option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.

提供的原生監控

當前連接的客戶端數和鏈接數

redis-cli --stat查看當前鏈接的客戶端數,鏈接數等

------- data ------ --------------------- load -------------------- - child -
keys       mem      clients blocked requests            connections
4          1.27M    6       0       17340 (+0)          111
4          1.27M    6       0       17341 (+1)          111
4          1.27M    6       0       17342 (+1)          111
4          1.27M    6       0       17343 (+1)          111

內存最大的鍵值和平均的鍵值數據

redis-cli --bigkeys 對當前佔用內存最大的鍵值和平均的鍵值數據,也能夠經過指定-i參數定時查看當前的視圖狀況。

# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).

[00.00%] Biggest string found so far 'asdf.js' with 3 bytes
[00.00%] Biggest string found so far 'wabg-tokeneyJhbGciOiJIUzI1NiJ9.NA.UGGRiB2I42rP-33cIMrcoPub7AzHgDlqHacAKFw1pfE' with 328 bytes
[00.00%] Biggest string found so far 'wabg-token-province' with 231042 bytes

-------- summary -------

Sampled 4 keys in the keyspace!
Total key length in bytes is 180 (avg len 45.00)

Biggest string found 'wabg-token-province' has 231042 bytes

4 strings with 231819 bytes (100.00% of keys, avg size 57954.75)
0 lists with 0 items (00.00% of keys, avg size 0.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
0 hashs with 0 fields (00.00% of keys, avg size 0.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)

查看當前的鍵值狀況

redis-cli --scan提供和keys *類似的功能,查看當前的鍵值狀況,能夠經過正則表達

$ redis-cli --scan

sess:K4xh-bxOBrcXpy9kEW87oiy-u7I2sAA5
asdf.js
sess:1tGNZSXW8GyoEQsbtpqkA5tMmSFp_ZIn
wabg-tokeneyJhbGciOiJIUzI1NiJ9.NA.UGGRiB2I42rP-33cIMrcoPub7AzHgDlqHacAKFw1pfE
sess:3e4NGIJd0wf1-RONeTt-FsXQj4EaVNjk
wabg-token-province
sess:UuCLAX2sWZ50fiIO1qvDgulf0XIZRd98
wabg-tokeneyJhbGciOiJIUzI1NiJ9.MQ.6z44GClzAsUED1M_UyxqdREdDKcYFnL9tSqd5ZhLhsY
sess:2HEchaRLYUoaa44IF1bB6mpik7lZjBb4

原生的Monitor監控

redis-cli monitor打印出全部sever接收到的命令以及其對應的客戶端地址

$ redis-cli monitor
OK
1472626566.218175 [0 127.0.0.1:62862] "info"
1472626571.220948 [0 127.0.0.1:62862] "exists" "aaa"
1472626571.223174 [0 127.0.0.1:62862] "set" "aaa" ""
1472626571.232126 [0 127.0.0.1:62862] "type" "aaa"
1472626571.243697 [0 127.0.0.1:62862] "pttl" "aaa"
1472626571.243717 [0 127.0.0.1:62862] "object" "ENCODING" "aaa"
1472626571.243726 [0 127.0.0.1:62862] "strlen" "aaa"

配置說明

#redis.conf
# Redis configuration file example.
# ./redis-server /path/to/redis.conf

################################## INCLUDES ###################################
#這在你有標準配置模板可是每一個redis服務器又須要個性設置的時候頗有用。
# include /path/to/local.conf
# include /path/to/other.conf

################################ GENERAL #####################################

# 是否在後臺執行,yes:後臺運行;no:不是後臺運行(老版本默認)
daemonize yes

# 3.2裏的參數,是否開啓保護模式,默認開啓。要是配置裏沒有指定bind和密碼。
# 開啓該參數後,redis只會本地進行訪問,拒絕外部訪問。
# 要是開啓了密碼   和bind,能夠開啓。否   則最好關閉,設置爲no。

protected-mode yes
# redis的進程文件
pidfile /var/run/redis/redis-server.pid

# redis監聽的端口號。
port 6379

# 此參數肯定了TCP鏈接中已完成隊列(完成三次握手以後)的長度, 
# 固然此值必須不大於Linux系統定義的/proc/sys/net/core/somaxconn值,默認是511,
# 而Linux的默認參數值是128。當系統併發量大而且客戶端速度緩慢的時候,
# 能夠將這二個參數一塊兒參考設定。該內核參數默認值通常是128,對於負載很大的服務程序來講大大的不夠。
# 通常會將它修改成2048或者更大。在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,而後在終端中執行sysctl -p。
tcp-backlog 511

#指定 redis 只接收來自於該 IP 地址的請求,若是不進行設置,那麼將處理全部請求
bind 127.0.0.1

# 配置unix socket來讓redis支持監聽本地鏈接。
# unixsocket /var/run/redis/redis.sock
# 配置unix socket使用文件的權限
# unixsocketperm 700

# 此參數爲設置客戶端空閒超過timeout,服務端會斷開鏈接,爲0則服務端不會主動斷開鏈接,不能小於0。
timeout 0

# tcp keepalive參數。若是設置不爲0,就使用配置tcp的SO_KEEPALIVE值,
# 使用keepalive有兩個好處:檢測掛掉的對端。下降中間設備出問題而致使網絡看似鏈接卻已經與對端端口的問題。
# 在Linux內核中,設置了keepalive,redis會定時給對端發送ack。檢測到對端關閉須要兩倍的設置值。
tcp-keepalive 0

# 指定了服務端日誌的級別。級別包括:debug(不少信息,方便開發、測試),
# verbose(許多有用的信息,可是沒有debug級別信息多),notice(適當的日誌級別,適合生產環境),warn(只有很是重要的信息)
loglevel notice

#指定了記錄日誌的文件。空字符串的話,日誌會打印到標準輸出設備。後臺運行的redis標準輸出是/dev/null。
logfile /var/log/redis/redis-server.log

# 是否打開記錄syslog功能
# syslog-enabled no

# syslog的標識符。
# syslog-ident redis

# 日誌的來源、設備
# syslog-facility local0

# 數據庫的數量,默認使用的數據庫是DB 0。能夠經過」SELECT 「命令選擇一個db
databases 16

################################ SNAPSHOTTING ################################
# 快照配置
# 註釋掉「save」這一行配置項就可讓保存數據庫功能失效
# 設置sedis進行數據庫鏡像的頻率。
# 900秒(15分鐘)內至少1個key值改變(則進行數據庫保存--持久化) 
# 300秒(5分鐘)內至少10個key值改變(則進行數據庫保存--持久化) 
# 60秒(1分鐘)內至少10000個key值改變(則進行數據庫保存--持久化)
save 900 1
save 300 10
save 60 10000

# 當RDB持久化出現錯誤後,是否依然進行繼續進行工做,yes:不能進行工做,no:能夠繼續進行工做,
# 能夠經過info中的rdb_last_bgsave_status瞭解RDB持久化是否有錯誤
stop-writes-on-bgsave-error yes

# 使用壓縮rdb文件,rdb文件壓縮使用LZF壓縮算法,yes:壓縮,可是須要一些cpu的消耗。no:不壓縮,須要更多的磁盤空間
rdbcompression yes

# 是否校驗rdb文件。從rdb格式的第五個版本開始,在rdb文件的末尾會帶上CRC64的校驗和。
# 這跟有利於文件的容錯性,可是在保存rdb文件的時候,會有大概10%的性能損耗,因此若是你追求高性能,能夠關閉該配置。
rdbchecksum yes

# rdb文件的名稱
dbfilename dump.rdb

# 數據目錄,數據庫的寫入會在這個目錄。rdb、aof文件也會寫在這個目錄
dir /var/lib/redis

################################# REPLICATION #################################
# 複製選項,slave複製對應的master。
# slaveof <masterip> <masterport>

#若是master設置了requirepass,那麼slave要連上master,須要有master的密碼才行。masterauth就是用來配置master的密碼,這樣能夠在連上master後進行認證。
# masterauth <master-password>

#當從庫同主機失去鏈接或者複製正在進行,從機庫有兩種運行方式:1) 若是slave-serve-stale-data設置爲yes(默認設置),從庫會繼續響應客戶端的請求。2) 若是slave-serve-stale-data設置爲no,除去INFO和SLAVOF命令以外的任何請求都會返回一個錯誤」SYNC with master in progress」。
slave-serve-stale-data yes

#做爲從服務器,默認狀況下是隻讀的(yes),能夠修改爲NO,用於寫(不建議)。
slave-read-only yes

#是否使用socket方式複製數據。目前redis複製提供兩種方式,disk和socket。若是新的slave連上來或者重連的slave沒法部分同步,就會執行全量同步,master會生成rdb文件。有2種方式:disk方式是master建立一個新的進程把rdb文件保存到磁盤,再把磁盤上的rdb文件傳遞給slave。socket是master建立一個新的進程,直接把rdb文件以socket的方式發給slave。disk方式的時候,當一個rdb保存的過程當中,多個slave都能共享這個rdb文件。socket的方式就的一個個slave順序複製。在磁盤速度緩慢,網速快的狀況下推薦用socket方式。
repl-diskless-sync no

#diskless複製的延遲時間,防止設置爲0。一旦複製開始,節點不會再接收新slave的複製請求直到下一個rdb傳輸。因此最好等待一段時間,等更多的slave連上來。
repl-diskless-sync-delay 5

#slave根據指定的時間間隔向服務器發送ping請求。時間間隔能夠經過 repl_ping_slave_period 來設置,默認10秒。
# repl-ping-slave-period 10

#複製鏈接超時時間。master和slave都有超時時間的設置。master檢測到slave上次發送的時間超過repl-timeout,即認爲slave離線,清除該slave信息。slave檢測到上次和master交互的時間超過repl-timeout,則認爲master離線。須要注意的是repl-timeout須要設置一個比repl-ping-slave-period更大的值,否則會常常檢測到超時。
# repl-timeout 60

#是否禁止複製tcp連接的tcp nodelay參數,可傳遞yes或者no。默認是no,即便用tcp nodelay。若是master設置了yes來禁止tcp nodelay設置,在把數據複製給slave的時候,會減小包的數量和更小的網絡帶寬。可是這也可能帶來數據的延遲。默認咱們推薦更小的延遲,可是在數據量傳輸很大的場景下,建議選擇yes。
repl-disable-tcp-nodelay no

#複製緩衝區大小,這是一個環形複製緩衝區,用來保存最新複製的命令。這樣在slave離線的時候,不須要徹底複製master的數據,若是能夠執行部分同步,只須要把緩衝區的部分數據複製給slave,就能恢復正常複製狀態。緩衝區的大小越大,slave離線的時間能夠更長,複製緩衝區只有在有slave鏈接的時候才分配內存。沒有slave的一段時間,內存會被釋放出來,默認1m。
# repl-backlog-size 5mb

#master沒有slave一段時間會釋放複製緩衝區的內存,repl-backlog-ttl用來設置該時間長度。單位爲秒。
# repl-backlog-ttl 3600

#當master不可用,Sentinel會根據slave的優先級選舉一個master。最低的優先級的slave,當選master。而配置成0,永遠不會被選舉。
slave-priority 100

#redis提供了可讓master中止寫入的方式,若是配置了min-slaves-to-write,健康的slave的個數小於N,mater就禁止寫入。master最少得有多少個健康的slave存活才能執行寫命令。這個配置雖然不能保證N個slave都必定能接收到master的寫操做,可是能避免沒有足夠健康的slave的時候,master不能寫入來避免數據丟失。設置爲0是關閉該功能。
# min-slaves-to-write 3

#延遲小於min-slaves-max-lag秒的slave才認爲是健康的slave。
# min-slaves-max-lag 10

# 設置1或另外一個設置爲0禁用這個特性。
# Setting one or the other to 0 disables the feature.
# By default min-slaves-to-write is set to 0 (feature disabled) and
# min-slaves-max-lag is set to 10.

################################## SECURITY ###################################
#requirepass配置可讓用戶使用AUTH命令來認證密碼,才能使用其餘命令。這讓redis可使用在不受信任的網絡中。爲了保持向後的兼容性,能夠註釋該命令,由於大部分用戶也不須要認證。使用requirepass的時候須要注意,由於redis太快了,每秒能夠認證15w次密碼,簡單的密碼很容易被攻破,因此最好使用一個更復雜的密碼。
# requirepass foobared

#把危險的命令給修改爲其餘名稱。好比CONFIG命令能夠重命名爲一個很難被猜到的命令,這樣用戶不能使用,而內部工具還能接着使用。
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

#設置成一個空的值,能夠禁止一個命令
# rename-command CONFIG ""
################################### LIMITS ####################################

# 設置能連上redis的最大客戶端鏈接數量。默認是10000個客戶端鏈接。
# 因爲redis不區分鏈接是客戶端鏈接仍是內部打開文件或者和slave鏈接等,因此maxclients最小建議設置到32。
# 若是超過了maxclients,redis會給新的鏈接發送’max number of clients reached’,並關閉鏈接。
# maxclients 10000

# redis配置的最大內存容量。當內存滿了,須要配合maxmemory-policy策略進行處理。
# 注意slave的輸出緩衝區是不計算在maxmemory內的。因此爲了防止主機內存使用完,建議設置的maxmemory須要更小一些。
# maxmemory <bytes>

# 內存容量超過maxmemory後的處理策略。
# volatile-lru:利用LRU算法移除設置過過時時間的key。
# volatile-random:隨機移除設置過過時時間的key。
# volatile-ttl:移除即將過時的key,根據最近過時時間來刪除(輔以TTL)
# allkeys-lru:利用LRU算法移除任何key。
# allkeys-random:隨機移除任何key。
# noeviction:不移除任何key,只是返回一個寫錯誤。
# 上面的這些驅逐策略,若是redis沒有合適的key驅逐,對於寫命令,仍是會返回錯誤。
# redis將再也不接收寫請求,只接收get請求。
# 寫命令包括:set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby getset mset msetnx exec sort。
# maxmemory-policy noeviction

#lru檢測的樣本數。使用lru或者ttl淘汰算法,從須要淘汰的列表中隨機選擇sample個key,選出閒置時間最長的key移除。
# maxmemory-samples 5

############################## APPEND ONLY MODE ###############################
#默認redis使用的是rdb方式持久化,這種方式在許多應用中已經足夠用了。可是redis若是中途宕機,會致使可能有幾分鐘的數據丟失,根據save來策略進行持久化,Append Only File是另外一種持久化方式,能夠提供更好的持久化特性。Redis會把每次寫入的數據在接收後都寫入 appendonly.aof 文件,每次啓動時Redis都會先把這個文件的數據讀入內存裏,先忽略RDB文件。
appendonly no

#aof文件名
appendfilename "appendonly.aof"

# aof持久化策略的配置
# no表示不執行fsync,由操做系統保證數據同步到磁盤,速度最快。
# always表示每次寫入都執行fsync,以保證數據同步到磁盤。
# everysec表示每秒執行一次fsync,可能會致使丟失這1s數據。
appendfsync everysec

# 在aof重寫或者寫入rdb文件的時候,會執行大量IO,
# 此時對於everysec和always的aof模式來講,執行fsync會形成阻塞過長時間,
# no-appendfsync-on-rewrite字段設置爲默認設置爲no。
# 若是對延遲要求很高的應用,這個字段能夠設置爲yes,不然仍是設置爲no,
# 這樣對持久化特性來講這是更安全的選擇。設置爲yes表示rewrite期間對新寫操做不fsync,
# 暫時存在內存中,等rewrite完成後再寫入,默認爲no,建議yes。Linux的默認fsync策略是30秒。可能丟失30秒數據。
no-appendfsync-on-rewrite no

# aof自動重寫配置。當目前aof文件大小超過上一次重寫的aof文件大小的百分之多少進行重寫,
# 即當aof文件增加到必定大小的時候Redis可以調用bgrewriteaof對日誌文件進行重寫。
# 當前AOF文件大小是上第二天志重寫獲得AOF文件大小的二倍(設置爲100)時,自動啓動新的日誌重寫過程。
auto-aof-rewrite-percentage 100
#設置容許重寫的最小aof文件大小,避免了達到約定百分比但尺寸仍然很小的狀況還要重寫
auto-aof-rewrite-min-size 64mb

# aof文件可能在尾部是不完整的,當redis啓動的時候,aof文件的數據被載入內存。
# 重啓可能發生在redis所在的主機操做系統宕機後,
# 尤爲在ext4文件系統沒有加上data=ordered選項(redis宕機或者異常終止不會形成尾部不完整現象。)
# 出現這種現象,能夠選擇讓redis退出,或者導入儘量多的數據。若是選擇的是yes,
# 當截斷的aof文件被導入的時候,會自動發佈一個log給客戶端而後load。若是是no,用戶必須手動redis-check-aof修復AOF文件才能夠。
aof-load-truncated yes

################################ LUA SCRIPTING ###############################
# 若是達到最大時間限制(毫秒),redis會記個log,而後返回error。
# 當一個腳本超過了最大時限。
# 只有SCRIPT KILL和SHUTDOWN NOSAVE能夠用。
# 第一個能夠殺沒有調write命令的東西。要是已經調用了write,只能用第二個命令殺。
lua-time-limit 5000

################################ REDIS CLUSTER ###############################
# 集羣開關,默認是不開啓集羣模式。
# cluster-enabled yes

# 集羣配置文件的名稱,每一個節點都有一個集羣相關的配置文件,持久化保存集羣的信息。
# 這個文件並不須要手動配置,這個配置文件有Redis生成並更新,每一個Redis集羣節點須要一個單獨的配置文件,
# 請確保與實例運行的系統中配置文件名稱不衝突
# cluster-config-file nodes-6379.conf

# 節點互連超時的閥值。集羣節點超時毫秒數
# cluster-node-timeout 15000

# 在進行故障轉移的時候,所有slave都會請求申請爲master,可是有些slave可能與master斷開鏈接一段時間了,
# 致使數據過於陳舊,這樣的slave不該該被提高爲master。該參數就是用來判斷slave節點與master斷線的時間是否過長。判斷方法是:
# 比較slave斷開鏈接的時間和(node-timeout * slave-validity-factor) + repl-ping-slave-period
# 若是節點超時時間爲三十秒, 而且slave-validity-factor爲10,假設默認的repl-ping-slave-period是10秒,
# 即若是超過310秒slave將不會嘗試進行故障轉移 
# cluster-slave-validity-factor 10

# master的slave數量大於該值,slave才能遷移到其餘孤立master上,
# 如這個參數若被設爲2,那麼只有當一個主節點擁有2 個可工做的從節點時,它的一個從節點會嘗試遷移。
# cluster-migration-barrier 1

# 默認狀況下,集羣所有的slot有節點負責,集羣狀態才爲ok,才能提供服務。
# 設置爲no,能夠在slot沒有所有分配的時候提供服務。
# 不建議打開該配置,這樣會形成分區的時候,小分區的master一直在接受寫請求,而形成很長時間數據不一致。
# cluster-require-full-coverage yes

################################## SLOW LOG ###################################
###slog log是用來記錄redis運行中執行比較慢的命令耗時。當命令的執行超過了指定時間,就記錄在slow log中,slog log保存在內存中,因此沒有IO操做。
#執行時間比slowlog-log-slower-than大的請求記錄到slowlog裏面,單位是微秒,因此1000000就是1秒。注意,負數時間會禁用慢查詢日誌,而0則會強制記錄全部命令。
slowlog-log-slower-than 10000

#慢查詢日誌長度。當一個新的命令被寫進日誌的時候,最老的那個記錄會被刪掉。這個長度沒有限制。只要有足夠的內存就行。你能夠經過 SLOWLOG RESET 來釋放內存。
slowlog-max-len 128

################################ LATENCY MONITOR ##############################
#延遲監控功能是用來監控redis中執行比較緩慢的一些操做,用LATENCY打印redis實例在跑命令時的耗時圖表。只記錄大於等於下邊設置的值的操做。0的話,就是關閉監視。默認延遲監控功能是關閉的,若是你須要打開,也能夠經過CONFIG SET命令動態設置。
latency-monitor-threshold 0

############################# EVENT NOTIFICATION ##############################
#鍵空間通知使得客戶端能夠經過訂閱頻道或模式,來接收那些以某種方式改動了 Redis 數據集的事件。由於開啓鍵空間通知功能須要消耗一些 CPU ,因此在默認配置下,該功能處於關閉狀態。
#notify-keyspace-events 的參數能夠是如下字符的任意組合,它指定了服務器該發送哪些類型的通知:
##K 鍵空間通知,全部通知以 __keyspace@__ 爲前綴
##E 鍵事件通知,全部通知以 __keyevent@__ 爲前綴
##g DEL 、 EXPIRE 、 RENAME 等類型無關的通用命令的通知
##$ 字符串命令的通知
##l 列表命令的通知
##s 集合命令的通知
##h 哈希命令的通知
##z 有序集合命令的通知
##x 過時事件:每當有過時鍵被刪除時發送
##e 驅逐(evict)事件:每當有鍵由於 maxmemory 政策而被刪除時發送
##A 參數 g$lshzxe 的別名
#輸入的參數中至少要有一個 K 或者 E,不然的話,無論其他的參數是什麼,都不會有任何 通知被分發。詳細使用能夠參考http://redis.io/topics/notifications

notify-keyspace-events "KEA"

############################### ADVANCED CONFIG ###############################
# 數據量小於等於hash-max-ziplist-entries的用ziplist,大於hash-max-ziplist-entries用hash
hash-max-ziplist-entries 512
# value大小小於等於hash-max-ziplist-value的用ziplist,大於hash-max-ziplist-value用hash。
hash-max-ziplist-value 64

# 數據量小於等於list-max-ziplist-entries用ziplist,大於list-max-ziplist-entries用list。
list-max-ziplist-entries 512
# value大小小於等於list-max-ziplist-value的用ziplist,大於list-max-ziplist-value用list。
list-max-ziplist-value 64

# 數據量小於等於set-max-intset-entries用iniset,大於set-max-intset-entries用set。
set-max-intset-entries 512

# 數據量小於等於zset-max-ziplist-entries用ziplist,大於zset-max-ziplist-entries用zset。
zset-max-ziplist-entries 128
# value大小小於等於zset-max-ziplist-value用ziplist,大於zset-max-ziplist-value用zset。
zset-max-ziplist-value 64

# value大小小於等於hll-sparse-max-bytes使用稀疏數據結構(sparse),
# 大於hll-sparse-max-bytes使用稠密的數據結構(dense)。
# 一個比16000大的value是幾乎沒用的,建議的value大概爲3000。
# 若是對CPU要求不高,對空間要求較高的,建議設置到10000左右。
hll-sparse-max-bytes 3000

# Redis將在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進行從新hash,能夠下降內存的使用。
# 當你的使用場景中,有很是嚴格的實時性須要,不可以接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置爲no。
# 若是沒有這麼嚴格的實時性要求,能夠設置爲yes,以便可以儘量快的釋放內存。
activerehashing yes

# 對客戶端輸出緩衝進行限制能夠強迫那些不從服務器讀取數據的客戶端斷開鏈接,用來強制關閉傳輸緩慢的客戶端。
# 對於normal client,第一個0表示取消hard limit,第二個0和第三個0表示取消soft limit,normal client默認取消限制,由於若是沒有尋問,他們是不會接收數據的。
client-output-buffer-limit normal 0 0 0
# 對於slave client和MONITER client,若是client-output-buffer一旦超過256mb,又或者超過64mb持續60秒,那麼服務器就會當即斷開客戶端鏈接。
client-output-buffer-limit slave 256mb 64mb 60
# 對於pubsub client,若是client-output-buffer一旦超過32mb,又或者超過8mb持續60秒,那麼服務器就會當即斷開客戶端鏈接。
client-output-buffer-limit pubsub 32mb 8mb 60

# redis執行任務的頻率爲1s除以hz。
hz 10

# 在aof重寫的時候,若是打開了aof-rewrite-incremental-fsync開關,系統會每32MB執行一次fsync。這對於把文件寫入磁盤是有幫助的,能夠避免過大的延遲峯值。
aof-rewrite-incremental-fsync yes
相關文章
相關標籤/搜索