1. 程式人生 > >redis詳解——redis叢集搭建和使用(二)

redis詳解——redis叢集搭建和使用(二)

上一章我寫到redis簡單的介紹和如何單機的使用,當我們redis相當重要的時候那麼接下來就需要搭建一個叢集了。

Redis叢集的介紹

1.1 redis-cluster(叢集)架構圖


架構細節:

(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.

(2)節點的fail(失敗)是通過叢集中超過半數的節點檢測失效時才生效.(那麼要求叢集最少三臺伺服器,每臺在帶一個備份,則最少6臺伺服器)

(3)客戶端與redis節點直連,不需要中間proxy.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可

(4)redis-cluster把所有的物理節點對映到

[0-16383]slot(槽),cluster負責維護node<->slot<->value

Redis叢集中內建了 16384 個雜湊槽,當需要在 Redis叢集中放置一個 key-value時,redis先對 key使用 crc16演算法算出一個結果,然後把結果對 16384求餘數,這樣每個 key都會對應一個編號在 0-16383之間的雜湊槽,redis會根據節點數量大致均等的將雜湊槽對映到不同的節點

1.2 redis-cluster投票:容錯


(1)領著投票過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超過(cluster-node-timeout),

認為當前master節點掛掉.

(2):什麼時候整個叢集不可用(cluster_state:fail)? 

    a:如果叢集任意master掛掉,且當前master沒有slave.叢集進入fail狀態,也可以理解成叢集的slot對映[0-16383]不完成時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage引數,預設關閉,開啟叢集相容部分失敗.

    b:如果叢集超過半數以上master掛掉,無論是否有slave叢集進入fail狀態.

  ps:當叢集不可用時,所有對叢集的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)

錯誤

Redis叢集的搭建

2.1 叢集搭建環境(ruby環境

redis叢集管理工具redis-trib.rb依賴ruby環境,首先需要安裝ruby環境:

第一步:安裝ruby

yum install ruby

yum install rubygems

 第二步:安裝rubyredis的介面程式

拷貝redis-3.0.0.gem/usr/local

執行:gem install /usr/local/redis-3.0.0.gem

ruby的指令碼在哪呢?在我們redis下的src原始碼下。

[[email protected] ~]# cd redis-3.0.0/src

[[email protected] src]# ll *.rb

-rwxrwxr-x. 1 root root 48141 Apr  1  2015 redis-trib.rb

需要將此指令碼複製到我們的安裝環境中。

第一步:在我們安裝redis中的bin目錄下建立一個redis-cluster資料夾

[[email protected] src]# mkdir /usr/local/redis-cluster

第二步:將redis-trib.rb複製到建立的redis-cluster資料夾下

[[email protected] src]# cp redis-trib.rb /usr/local/redis-cluster/

然後用此指令碼搭建叢集

2.2 搭建步驟

叢集中至少有三個節點。每個節點都需要有一個從節點。至少需要6臺伺服器(一主一備)。

因為筆者伺服器有限,所以搭建一個偽分散式:

需要6redis例項,執行在同一臺伺服器。埠號7001-7006。

第一步:建立6redis例項,每個例項執行在不同的埠。需要修改redis.conf配置檔案。配置檔案中還需要把cluster-enabled yes前的註釋去掉。

在建立的目錄中/user/local/redis下,一個bin就是一個redis例項,也就是一個redis伺服器。

所以複製/user/local/redis/bin 到 /user/local/redis-cluster/redis01  因為需要6個所以同理到06(注意將bin改名為redis0x了) 。

[[email protected] src]# cd /usr/local/redis
[[email protected] redis]# cp -r bin /usr/local/redis-cluster/redis01
[[email protected] redis]# cp -r bin /usr/local/redis-cluster/redis02
[[email protected] redis]# cp -r bin /usr/local/redis-cluster/redis03
[[email protected] redis]# cp -r bin /usr/local/redis-cluster/redis04
[[email protected] redis]# cp -r bin /usr/local/redis-cluster/redis05
[[email protected] redis]# cp -r bin /usr/local/redis-cluster/redis06
[[email protected] redis]# 

更改每個redis0x下的redis.conf的埠號port並去掉cluster-enabled yes前的註釋去掉


第二步:啟動每個redis例項。這裡啟動每一個很麻煩,可以寫一個啟動這6個的指令碼(建立一個start-all.sh)注意:這個指令碼所在的位置!

[[email protected] redis-cluster]# vim start-all.sh

輸入:

cd redis01 
./redis-server redis.conf  
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf

儲存之後不能執行,需要修改許可權

輸入:chmod u+x start-all.sh 

[[email protected] redis-cluster]# chmod u+x start-all.sh

修改完許可權之後,輸入./start-all.sh

[[email protected] redis-cluster]# ./start-all.sh 

啟動完畢!此時看一下程序確定啟動成功

輸入:ps aux|grep redis

[[email protected] redis-cluster]# ps aux|grep redis

能夠看到

root     31635  0.0  0.1  33936  1988 ?        Ssl  06:33   0:00 ./redis-server *:7001 [cluster]
root     31637  0.0  0.1  33936  1988 ?        Ssl  06:33   0:00 ./redis-server *:7002 [cluster]
root     31641  0.0  0.1  33936  1988 ?        Ssl  06:33   0:00 ./redis-server *:7003 [cluster]
root     31647  0.0  0.1  33936  1988 ?        Ssl  06:33   0:00 ./redis-server *:7004 [cluster]
root     31649  0.0  0.1  33936  1984 ?        Ssl  06:33   0:00 ./redis-server *:7005 [cluster]
root     31653  0.0  0.1  33936  1988 ?        Ssl  06:33   0:00 ./redis-server *:7006 [cluster]

證明啟動成功!

第三步:使用ruby指令碼搭建叢集。

編寫指令碼命令:

./redis-trib.rb create --replicas 1 192.168.204.134:7001 192.168.204.134:7002 192.168.204.134:7003 192.168.204.134:7004 192.168.204.134:7005  192.168.204.134:7006
解釋:啟動ruby命令:後面的引數是讓它按照這種方式啟動,其中,-replicas是備份機 後面的1是指每個都有一個備份。

輸入:指令碼命令。

[[email protected] redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.204.134:7001 192.168.204.134:7002 192.168.204.134:7003 192.168.204.134:7004 192.168.204.134:7005  192.168.204.134:7006

注意:這裡因為拷貝的時候在第一章用過,導致有資料,不是新的,它會拋一個錯,這個錯是[ERR] Node 192.168.204.134:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

這時:解決需要將叢集關閉掉,然後每一個叢集下的dump.rdb 和 nodes.conf刪掉。在將叢集從新啟動。

1、編寫關閉叢集的批量指令碼 建立關閉叢集的指令碼:[[email protected] redis-cluster]# vim shutdow-all.sh

2、編寫內容:

redis01/redis-cli -p 7001 shutdown

redis01/redis-cli -p 7002 shutdown

redis01/redis-cli -p 7003 shutdown

redis01/redis-cli -p 7004 shutdown

redis01/redis-cli -p 7005 shutdown

redis01/redis-cli -p 7006 shutdown

注意:(因為客戶端可以連線所有的服務,所以只用redis01/redis-cli 關閉就可以)

3、更改關閉指令碼的許可權:[[email protected] redis-cluster]# chmod u+x shutdow-all.sh 

4、執行關閉叢集:./shutdow-all.sh

5、檢視程序 ps aux|grep redis、關閉成功。

然後刪除所有0x下的dump.rdb 執行批量命令:rm -f redis0*/dump.rdb

[[email protected] redis-cluster]# rm -f redis0*/dump.rdb

同理刪除nodes.conf 

[[email protected] redis-cluster]# rm -f redis0*/nodes.conf

刪除成功!接下來重新啟動

[[email protected] redis-cluster]# ./start-all.sh  

[[email protected] redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.204.134:7001 192.168.204.134:7002 192.168.204.134:7003 192.168.204.134:7004 192.168.204.134:7005  192.168.204.134:7006

>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.204.134:7001
192.168.204.134:7002
192.168.204.134:7003
Adding replica 192.168.204.134:7004 to 192.168.204.134:7001
Adding replica 192.168.204.134:7005 to 192.168.204.134:7002
Adding replica 192.168.204.134:7006 to 192.168.204.134:7003
M: 6c011939ded42f173718917ed44d1da7476b9d5b 192.168.204.134:7001
   slots:0-5460 (5461 slots) master
M: f82a8527c278572b6d7957e0be0bb9360a85d957 192.168.204.134:7002
   slots:5461-10922 (5462 slots) master
M: 422b498bc52837b0125d74721466a207b8e9ce4d 192.168.204.134:7003
   slots:10923-16383 (5461 slots) master
S: d8092f56af3206899cb54ff4acb14bc8b13fd640 192.168.204.134:7004
   replicates 6c011939ded42f173718917ed44d1da7476b9d5b
S: 7d63094e086a0488ecbf0904092ca901fdfb3f16 192.168.204.134:7005
   replicates f82a8527c278572b6d7957e0be0bb9360a85d957
S: 46f016bde6a8eef81697f6c75e1a8a74f7f415fc 192.168.204.134:7006
   replicates 422b498bc52837b0125d74721466a207b8e9ce4d
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 192.168.204.134:7001)
M: 6c011939ded42f173718917ed44d1da7476b9d5b 192.168.204.134:7001
   slots:0-5460 (5461 slots) master
M: f82a8527c278572b6d7957e0be0bb9360a85d957 192.168.204.134:7002
   slots:5461-10922 (5462 slots) master
M: 422b498bc52837b0125d74721466a207b8e9ce4d 192.168.204.134:7003
   slots:10923-16383 (5461 slots) master
M: d8092f56af3206899cb54ff4acb14bc8b13fd640 192.168.204.134:7004
   slots: (0 slots) master
   replicates 6c011939ded42f173718917ed44d1da7476b9d5b
M: 7d63094e086a0488ecbf0904092ca901fdfb3f16 192.168.204.134:7005
   slots: (0 slots) master
   replicates f82a8527c278572b6d7957e0be0bb9360a85d957
M: 46f016bde6a8eef81697f6c75e1a8a74f7f415fc 192.168.204.134:7006
   slots: (0 slots) master
   replicates 422b498bc52837b0125d74721466a207b8e9ce4d
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
搭建成功!節點的新增和修改,以後有需求在修改此文件。暫時寫到這。

叢集的使用方法

3.1 Redis-cli連線叢集。

[[email protected] redis-cluster]# redis01/redis-cli -p 7002 -c

-c:代表連線的是redis叢集

或者指定ip和埠的連線

[[email protected] redis-cluster]# redis01/redis-cli -h 192.168.25.174 -p 7006 -c

 連線叢集需要新增-c 引數。否則節點之間跳轉失敗。

叢集版只有一個庫。

使用的方法同單機版,見上一章。

3.2 檢視叢集狀態

連線之後輸入命令:cluster info
192.168.204.134:7006> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:10
cluster_my_epoch:8
cluster_stats_messages_sent:778
cluster_stats_messages_received:772

3.3 檢視叢集節點

連線之後輸入命令:cluster nodes
192.168.204.134:7006> cluster nodes
f82a8527c278572b6d7957e0be0bb9360a85d957 192.168.204.134:7002 slave 7d63094e086a0488ecbf0904092ca901fdfb3f16 0 1497743623527 10 connected
6c011939ded42f173718917ed44d1da7476b9d5b 192.168.204.134:7001 slave d8092f56af3206899cb54ff4acb14bc8b13fd640 0 1497743622518 7 connected
46f016bde6a8eef81697f6c75e1a8a74f7f415fc 192.168.204.134:7006 myself,master - 0 0 8 connected 10923-16383
7d63094e086a0488ecbf0904092ca901fdfb3f16 192.168.204.134:7005 master - 0 1497743618478 10 connected 5461-10922
d8092f56af3206899cb54ff4acb14bc8b13fd640 192.168.204.134:7004 master - 0 1497743617468 7 connected 0-5460
422b498bc52837b0125d74721466a207b8e9ce4d 192.168.204.134:7003 slave 46f016bde6a8eef81697f6c75e1a8a74f7f415fc 0 1497743619488 8 connected

圖形工具不支援叢集。

說明:

./redis-cli -c -h 192.168.204.134 -p 7001 ,其中-c表示以叢集方式連線redis-h指定ip地址,-p指定埠號

cluster nodes 查詢叢集結點資訊

 cluster info 查詢叢集狀態資訊

3.4 jedis連線叢集版。(重點)

3.4.1 jedis連線叢集不使用連線池

jedis的詳解見上一章。

匯入的jar包和上一章一樣,是那兩個jar包(commons-pool2-2.3.jar和jedis-2.7.0.jar)

如何連線叢集版,

第一步:使用JedisCluster物件。需要一個Set<HostAndPort>引數。Redis節點的列表。

第二步:直接使用JedisCluster物件操作redis。在系統中單例存在。

第三步:列印結果

第四步:系統關閉前,關閉JedisCluster物件。

@Test
public void testJedisCluster() throws Exception {
	// 第一步:使用JedisCluster物件。需要一個Set<HostAndPort>引數。Redis節點的列表。
	Set<HostAndPort> nodes = new HashSet<>();
	nodes.add(new HostAndPort("192.168.204.134", 7001));
	nodes.add(new HostAndPort("192.168.204.134", 7002));
	nodes.add(new HostAndPort("192.168.204.134", 7003));
	nodes.add(new HostAndPort("192.168.204.134", 7004));
	nodes.add(new HostAndPort("192.168.204.134", 7005));
	nodes.add(new HostAndPort("192.168.204.134", 7006));
	JedisCluster jedisCluster = new JedisCluster(nodes);
	// 第二步:直接使用JedisCluster物件操作redis。在系統中單例存在。
	jedisCluster.set("hello", "100");
	String result = jedisCluster.get("hello");
	// 第三步:列印結果
	System.out.println(result);
	// 第四步:系統關閉前,關閉JedisCluster物件。
	jedisCluster.close();
}

3.4.2 jedis連線redis叢集使用連線池

// 連線redis叢集並使用連線池
@Test
public void testJedisCluster2() {
	//獲取連線物件可以省略使用預設(配置JEdisPoolConfig的設定)
	JedisPoolConfig config = new JedisPoolConfig();
	// 最大連線數
	config.setMaxTotal(30);
	// 最大連線空閒數
	config.setMaxIdle(2);
	//叢集結點
	Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
	jedisClusterNode.add(new HostAndPort("192.168.204.134", 7001));
	jedisClusterNode.add(new HostAndPort("192.168.204.134", 7002));
	jedisClusterNode.add(new HostAndPort("192.168.204.134", 7003));
	jedisClusterNode.add(new HostAndPort("192.168.204.134", 7004));
	jedisClusterNode.add(new HostAndPort("192.168.204.134", 7005));
	jedisClusterNode.add(new HostAndPort("192.168.204.134", 7006));
	JedisCluster jc = new JedisCluster(jedisClusterNode, config);
	JedisCluster jcd = new JedisCluster(jedisClusterNode);
	jcd.set("name", "zhangsan");
	String value = jcd.get("name");
	System.out.println(value);
}

3.4.3 jedis連線使用spring

配置applicationContext.xml

<!-- 連線池配置 -->
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<!-- 最大連線數 -->
		<property name="maxTotal" value="30" />
		<!-- 最大空閒連線數 -->
		<property name="maxIdle" value="10" />
		<!-- 每次釋放連線的最大數目 -->
		<property name="numTestsPerEvictionRun" value="1024" />
		<!-- 釋放連線的掃描間隔(毫秒) -->
		<property name="timeBetweenEvictionRunsMillis" value="30000" />
		<!-- 連線最小空閒時間 -->
		<property name="minEvictableIdleTimeMillis" value="1800000" />
		<!-- 連線空閒多久後釋放, 當空閒時間>該值 且 空閒連線>最大空閒連線數 時直接釋放 -->
		<property name="softMinEvictableIdleTimeMillis" value="10000" />
		<!-- 獲取連線時的最大等待毫秒數,小於零:阻塞不確定的時間,預設-1 -->
		<property name="maxWaitMillis" value="1500" />
		<!-- 在獲取連線的時候檢查有效性, 預設false -->
		<property name="testOnBorrow" value="true" />
		<!-- 在空閒時檢查有效性, 預設false -->
		<property name="testWhileIdle" value="true" />
		<!-- 連線耗盡時是否阻塞, false報異常,ture阻塞直到超時, 預設true -->
		<property name="blockWhenExhausted" value="false" />
	</bean>	
	<!-- redis叢集 -->
	<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
		<constructor-arg index="0">
			<set>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg index="0" value="192.168.204.134"></constructor-arg>
					<constructor-arg index="1" value="7001"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg index="0" value="192.168.204.134"></constructor-arg>
					<constructor-arg index="1" value="7002"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg index="0" value="192.168.204.134"></constructor-arg>
					<constructor-arg index="1" value="7003"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg index="0" value="192.168.204.134"></constructor-arg>
					<constructor-arg index="1" value="7004"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg index="0" value="192.168.204.134"></constructor-arg>
					<constructor-arg index="1" value="7005"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg index="0" value="192.168.204.134"></constructor-arg>
					<constructor-arg index="1" value="7006"></constructor-arg>
				</bean>
			</set>
		</constructor-arg>
		<constructor-arg index="1" ref="jedisPoolConfig"></constructor-arg>
	</bean>

測試程式碼

private ApplicationContext applicationContext;

	@Before
	public void init() {
		applicationContext = new ClassPathXmlApplicationContext(
				"classpath:applicationContext.xml");
	}

	//redis叢集
	@Test
	public void testJedisCluster() {
	JedisCluster jedisCluster = (JedisCluster) applicationContext
					.getBean("jedisCluster");
			
			jedisCluster.set("name", "zhangsan");
			String value = jedisCluster.get("name");
			System.out.println(value);
	}

實際應用的例子這裡就不做介紹了,下面介紹一下附錄:

4附:

4.1 redis.conf

Redis 支援很多的引數,但都有預設值。

daemonize:

預設情況下,redis 不是在後臺執行的,如果需要在後臺執行,把該項的值更改為yes

pidfile

Redis 在後臺執行的時候,Redis 預設會把pid 檔案放在/var/run/redis.pid,你可以配置到其他地址。當執行多個redis 服務時,需要指定不同的pid 檔案和埠

bind

指定Redis 只接收來自於該IP 地址的請求,如果不進行設定,那麼將處理所有請求,在生產環境中最好設定該項

port

監聽埠,預設為6379

timeout

    設定客戶端連線時的超時時間,單位為秒。當客戶端在這段時間內沒有發出任何指令,那麼關閉該連線

loglevel

log 等級分為4 級,debug, verbose, notice, warning。生產環境下一般開啟notice

logfile

配置log 檔案地址,預設使用標準輸出,即列印在命令列終端的視窗上

databases

設定資料庫的個數,可以使用SELECT <dbid>命令來切換資料庫。預設使用的資料庫是0

save

設定Redis 進行資料庫映象的頻率。

if(60 秒之內有10000 keys 發生變化時){

進行映象備份

}else if(300 秒之內有10 keys 發生了變化){

進行映象備份

}else if(900 秒之內有1 keys 發生了變化){

進行映象備份

}

rdbcompression

在進行映象備份時,是否進行壓縮

dbfilename

映象備份檔案的檔名

dir

資料庫映象備份的檔案放置的路徑。這裡的路徑跟檔名要分開配置是因為Redis 在進行備份時,先會將當前資料庫的狀態寫入到一個臨時檔案中,等備份完成時,再把該該臨時檔案替換為上面所指定的檔案,而這裡的臨時檔案和上面所配置的備份檔案都會放在這個指定的路徑當中

slaveof

設定該資料庫為其他資料庫的從資料庫

masterauth

當主資料庫連線需要密碼驗證時,在這裡指定

requirepass

設定客戶端連線後進行任何其他指定前需要使用的密碼。警告:因為redis 速度相當快,所以在一臺比較好的伺服器下,一個外部的使用者可以在一秒鐘進行150K 次的密碼嘗試,這意味著你需要指定非常非常強大的密碼來防止暴力破解。

maxclients

限制同時連線的客戶數量。當連線數超過這個值時,redis 將不再接收其他連線請求,客戶端嘗試連線時將收到error 資訊。

maxmemory

設定redis 能夠使用的最大記憶體。當記憶體滿了的時候,如果還接收到set 命令,redis 先嚐試剔除設定過expire 資訊的key,而不管該key 的過期時間還沒有到達。在刪除時,將按照過期時間進行刪除,最早將要被過期的key 將最先被刪除。如果帶有expire 資訊key 都刪光了,那麼將返回錯誤。這樣,redis 將不再接收寫請求,只接收get 請求。maxmemory 的設定比較適合於把redis 當作於類似memcached 的快取來使用。

appendonly

預設情況下,redis 會在後臺非同步的把資料庫映象備份到磁碟,但是該備份是非常耗時的,而且備份也不能很頻繁,如果發生諸如拉閘限電、拔插頭等狀況,那麼將造成比較大範圍的資料丟失。所以redis 提供了另外一種更加高效的資料庫備份及災難恢復方式。開啟append only 模式之後,redis 會把所接收到的每一次寫操作請求都追加到appendonly.aof 檔案中,當redis 重新啟動時,會從該檔案恢復出之前的狀態。但是這樣會造成appendonly.aof 檔案過大,所以redis 還支援了BGREWRITEAOF 指令,對appendonly.aof 進行重新整理。所以我認為推薦生產環境下的做法為關閉映象,開啟appendonly.aof,同時可以選擇在訪問較少的時間每天對appendonly.aof 進行重寫一次。

appendfsync

設定對appendonly.aof 檔案進行同步的頻率。always 表示每次有寫操作都進行同步,everysec 表示對寫操作進行累積,每秒同步一次。這個需要根據實際業務場景進行配置

vm-enabled

是否開啟虛擬記憶體支援。因為redis 是一個記憶體資料庫,而且當記憶體滿的時候,無法接收新的寫請求,所以在redis 2.0 中,提供了虛擬記憶體的支援。但是需要注意的是,redis中,所有的key 都會放在記憶體中,在記憶體不夠時,只會把value 值放入交換區。這樣保證了雖然使用虛擬記憶體,但效能基本不受影響,同時,你需要注意的是你要把vm-max-memory 設定到足夠來放下你的所有的key

vm-swap-file

設定虛擬記憶體的交換檔案路徑

vm-max-memory

這裡設定開啟虛擬記憶體之後,redis 將使用的最大實體記憶體的大小。預設為0redis 把他所有的能放到交換檔案的都放到交換檔案中,以儘量少的使用實體記憶體。在生產環境下,需要根據實際情況設定該值,最好不要使用預設的0

vm-page-size

設定虛擬記憶體的頁大小,如果你的value 值比較大,比如說你要在value 中放置部落格、新聞之類的所有文章內容,就設大一點,如果要放置的都是很小的內容,那就設小一點。

vm-pages

設定交換檔案的總的page 數量,需要注意的是,page table 資訊會放在實體記憶體中,每8 page 就會佔據RAM 中的1 byte。總的虛擬記憶體大小 = vm-page-size * vm-pages

vm-max-threads

設定VM IO 同時使用的執行緒數量。因為在進行記憶體交換時,對資料有編碼和解碼的過程,所以儘管IO 裝置在硬體上本上不能支援很多的併發讀寫,但是還是如果你所儲存vlaue 值比較大,將該值設大一些,還是能夠提升效能的

glueoutputbuf

把小的輸出快取放在一起,以便能夠在一個TCP packet 中為客戶端傳送多個響應,具體原理和真實效果我不是很清楚。所以根據註釋,你不是很確定的時候就設定成yes

hash-max-zipmap-entries

redis 2.0 中引入了hash 資料結構。當hash 中包含超過指定元素個數並且最大的元素沒有超過臨界時,hash 將以一種特殊的編碼方式(大大減少記憶體使用)來儲存,這裡可以設定這兩個臨界值

activerehashing

開啟之後,redis 將在每100 毫秒時使用1 毫秒的CPU 時間來對redis hash 表進行重hash,可以降低記憶體的使用。當你的使用場景中,有非常嚴格的實時性需要,不能夠接受Redis 時不時的對請求有2 毫秒的延遲的話,把這項配置為no。如果沒有這麼嚴格的實時性要求,可以設定為yes,以便能夠儘可能快的釋放記憶體