轉:
版權聲明:本文為博主原創文章,轉載請看官大人注明出處: https://blog.csdn.net/localhost01/article/details/71436801
一.搭建redis單機
本文搭建redis3.0版本,3.0主要增加了redis cluster集群功能。
1.下載地址:http://download.redis.io/releases/redis-3.0.0.tar.gz,將下載文件拷貝到/usr/local
2.解壓源碼:tar -zxvf redis-3.0.0.tar.gz
3.編譯源碼:cd /usr/local/redis-3.0.0
make
4.安裝到指定目錄: cd /usr/local/redis-3.0.0
make PREFIX=/usr/local/redis install
5.進入源碼目錄,將redis.conf拷貝到安裝路徑:cd /usr/local/redis
mkdir confcp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin
6.修改redis.conf配置文件,以后端模式啟動:daemonize yes
7.啟動redis:cd /usr/local/redis ./bin/redis-server ./redis.conf //在何處啟動的server,一些配置文件就默認在該處生成(如果配置的相對路徑)
8.redis.conf配置文件主要配置:
port 7001 //監聽的端口# bind 127.0.0.1 //綁定ip,只允許該ip訪問,不填默認為*,表示允許所有ip訪問requirepass "你的密碼" //開啟密碼loglevel debug //日志級別,開發模式盡量選用debuglogfile "redis.log" //日志文件路徑,此處使用相對路徑,將生成到/usr/local/redis下maxmemory 100000000 //允許最大內存占用100mappendonly yes //啟用aofauto-aof-rewrite-percentage 80 //部署在同一機器的多個redis實例,建議把auto-aof-rewrite錯開(可分別寫80-100不等),防止瞬間fork,所有redis進程做rewrite,占用大量內存
9.jedis連接redis單機:
-
<dependency>
-
<groupId>redis.clients</groupId>
-
<artifactId>jedis</artifactId>
-
<version> 2.7.0</version>
-
</dependency>
-
連接池整合spring:
-
<!-- redis連接池(單例) -->
-
<bean id= "jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
-
<constructor-arg name= "poolConfig" ref="jedisPoolConfig"/>
-
<constructor-arg name= "host" value="${redis.host}"/>
-
<constructor-arg name= "port" value="${redis.port}"/>
-
<constructor-arg name= "timeout" value="${redis.timeout}"/>
-
<constructor-arg name= "password" value="${redis.pass}"/>
-
</bean>
-
<!-- 連接池配置 -->
-
<bean id= "jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
-
<!-- 最大連接數 -->
-
<property name= "maxTotal" value="150" />
-
<!-- 最大空閑連接數 -->
-
<property name= "maxIdle" value="30" />
-
<!-- 最小空閑連接數 -->
-
<property name= "minIdle" value="10" />
-
<!-- 獲取連接時的最大等待毫秒數,小於零:阻塞不確定的時間,默認- 1 -->
-
<property name= "maxWaitMillis" value="3000" />
-
<!-- 每次釋放連接的最大數目 -->
-
<property name= "numTestsPerEvictionRun" value="100" />
-
<!-- 釋放連接的掃描間隔(毫秒) -->
-
<property name= "timeBetweenEvictionRunsMillis" value="3000" />
-
<!-- 連接最小空閑時間 -->
-
<property name= "minEvictableIdleTimeMillis" value="1800000" />
-
<!-- 連接空閑多久后釋放, 當空閑時間>該值 且 空閑連接>最大空閑連接數 時直接釋放 -->
-
<property name= "softMinEvictableIdleTimeMillis" value="10000" />
-
<!-- 在獲取連接的時候檢查有效性, 默認 false -->
-
<property name= "testOnBorrow" value="true" />
-
<!-- 在空閑時檢查有效性, 默認 false -->
-
<property name= "testWhileIdle" value="true" />
-
<!-- 在歸還給pool時,是否提前進行validate操作 -->
-
<property name= "testOnReturn" value="true" />
-
<!-- 連接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true -->
-
<property name= "blockWhenExhausted" value="false" />
-
</bean>
-
-
-
public class RedisTest {
-
-
private JedisPool pool;
-
-
public void testJedisPool() {
-
Jedis jedis = null;
-
String name = null;
-
try {
-
jedis = pool.getResource();
-
jedis.set( "testName", "RCL");
-
name = jedis.get( "testName");
-
} catch (Exception ex) {
-
ex.printStackTrace();
-
} finally {
-
if (jedis != null) {
-
// 返回給池
-
jedis.close();
-
}
-
Assert.assertEquals( "RCL", name);
-
}
-
}
10.如果連接不上,可查看是否防火牆沒有將redis端口開放:/etc/sysconfig/iptables添加:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 7001 -j ACCEPT //7001即redis端口
重啟防火牆
二、搭建redis集群
1.安裝ruby環境
集群管理工具redis-trib.rb依賴ruby環境
(1)安裝ruby:
yum install ruby yum install rubygems
(2)安裝ruby和redis的接口程序:
拷貝redis-3.0.0.gem至/usr/local。執行:gem install /usr/local/redis-3.0.0.gem
2.建立redis實例
(1)建立存放redis群的文件夾及子文件夾(用於存放每個redis實例):
cd /usr/localmkdir redis-clustermkdir redis-cluster/7001mkdir redis-cluster/7002
……
(2)將剛剛安裝的單機redis的/usr/local/redis文件夾拷貝到每個700X文件夾下,(這里我們建立六個實例,三主三從)
(3)修改每個700X目錄下的redis.conf配置文件:
port 700X //各自監聽的端口#bind 127.0.0.1 //這里不綁定,默認允許所有ip訪問,或者bind 0.0.0.0cluster-enabled yes //開啟集群cluster-node-timeout 15000 //15時間內沒有收到對方的回復,則單方面認為端節點掛掉另外,由於下面我們需要配置集群密碼,故之前配置的 requirepass 先刪掉,集群成功后再進行配置。
3.啟動各個redis:分別進入7001、7002、...7006目錄,執行./redis-server ./redis.conf
4.創建集群:/usr/local/redis-cluster/redis-trib.rb create --replicas 1 123.123.123.123:7001 123.123.123.123:7002 123.123.123.123:7003 123.123.123.123:7004 123.123.123.123:7005 123.123.123.123:7006
注意:
(1)為保證遠程可訪問,這里的ip盡量使用公網ip,且創建集群時可先關閉防火牆,否則可以出現一直join……的現象。
(2)redis集群至少需要3個主節點,每個主節點有一個從節點總共6個節點
(3)replicas指定為1表示每個主節點有一個從節點
(4)如果出現[ERR] Sorry, can't connect to node錯誤:
1.ruby 和rubygem 版本太低,安裝新版本。查看gem版本和redis版本(redis-cli -v可查看redis版本)2.查看reids配置文件,bind綁定的允許連接的ip是否正確。3.是否redis配置文件還是使用了密碼,使用了密碼也可能導致這個錯誤。
(5)如果出現[ERR] Node 127.0.0.1:7005 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0:
表示集群時,之前的redis已有數據,那么登錄到7005的redis中,執行FLUSHALL即可
(6)如果出現ERR Slot 0 is already busy (Redis::CommandError):
用redis-cli登錄到每個節點執行flushall和cluster reset即可2.6進入集群:./redis-cli -c -p 7001 -h 123.123.123.123(-c即-cluster 表示進入集群模式,不加表示進入單機redis)
5.檢查集群是否成功:進入集群后,鍵入cluster info,顯示cluster_state:ok,表示成功
6.設置密碼:
(1)登錄到每個節點,執行 config set masterauth 你的密碼 config set requirepass 你的密碼(2)隨后登入 7001/bin/redis-cli -c -h 112.74.55.239 -p 7004 -a 你的密碼,執行: config rewrite(3)防火牆開放7001到7006端口,以及redis總線:17001到17006:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 7001:7006 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 17001:17006 -j ACCEPT
7.JedisCluster連接redis集群
-
<dependency>
-
<groupId>redis.clients</groupId>
-
<artifactId>jedis</artifactId>
-
<version> 2.9.0</version> //2.9.0才支持cluster密碼認證,之前版本的jedisCluster.auth("密碼")方法里面什么都沒有實現,僅僅拋一個JedisClusterException("No way to dispatch this command to Redis Cluster.")
-
</dependency>
-
整合spring:
-
<!-- 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="${redis.host}"></constructor-arg>
-
<constructor-arg index= "1" value="${redis.port1}"></constructor-arg>
-
</bean>
-
<bean class="redis.clients.jedis.HostAndPort">
-
<constructor-arg index= "0" value="${redis.host}"></constructor-arg>
-
<constructor-arg index= "1" value="${redis.port2}"></constructor-arg>
-
</bean>
-
<bean class="redis.clients.jedis.HostAndPort">
-
<constructor-arg index= "0" value="${redis.host}"></constructor-arg>
-
<constructor-arg index= "1" value="${redis.port3}"></constructor-arg>
-
</bean>
-
<bean class="redis.clients.jedis.HostAndPort">
-
<constructor-arg index= "0" value="${redis.host}"></constructor-arg>
-
<constructor-arg index= "1" value="${redis.port4}"></constructor-arg>
-
</bean>
-
<bean class="redis.clients.jedis.HostAndPort">
-
<constructor-arg index= "0" value="${redis.host}"></constructor-arg>
-
<constructor-arg index= "1" value="${redis.port5}"></constructor-arg>
-
</bean>
-
<bean class="redis.clients.jedis.HostAndPort">
-
<constructor-arg index= "0" value="${redis.host}"></constructor-arg>
-
<constructor-arg index= "1" value="${redis.port6}"></constructor-arg>
-
</bean>
-
</set>
-
</constructor-arg>
-
<constructor-arg index= "1" value="${redis.timeout}"></constructor-arg>
-
<constructor-arg index= "2" value="${redis.sockettimeout}"></constructor-arg>
-
<constructor-arg index= "3" value="${redis.maxAttempts}"></constructor-arg>
-
<constructor-arg index= "4" value="${redis.pass}"></constructor-arg>
-
<constructor-arg index= "5" ref="jedisPoolConfig"></constructor-arg>
-
</bean>
-
-
-
public class RedisTest {
-
-
private JedisCluster jCluster;
-
-
public void testJCluster() {
-
jCluster.set( "name", "RCL");
-
String name = jCluster.get( "testName");
-
Assert.assertEquals( "RCL", name);
-
}