±à¼ÍƼö: |
ÎÄÕÂÏêϸ½éÉÜÁËRedis¼¯Èº¼Ü¹¹£¬RedisµÄ°²×°ÅäÖ㬴´½¨Redis¼¯ÈºµÄÏêϸ¹ý³ÌµÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×Ôcnblogs£¬ÓÉ»ðÁú¹ûÈí¼þLuca±à¼¡¢ÍƼö¡£ |
|
Redis¼¯Èº¼Ü¹¹Í¼
ÉÏͼÀ¶É«Îªredis¼¯ÈºµÄ½Úµã¡£
½ÚµãÖ®¼äͨ¹ýpingÃüÁîÀ´²âÊÔÁ¬½ÓÊÇ·ñÕý³££¬½ÚµãÖ®¼äûÓÐÖ÷Çø·Ö£¬Á¬½Óµ½ÈκÎÒ»¸ö½Úµã½øÐвÙ×÷ʱ£¬¶¼¿ÉÄÜ»áת·¢µ½ÆäËû½Úµã¡£
1¡¢RedisµÄÈÝ´í»úÖÆ
½ÚµãÖ®¼ä»á¶¨Ê±µÄ»¥Ïà·¢ËÍpingÃüÁ²âÊÔ½ÚµãµÄ½¡¿µ×´Ì¬£¬µ±½Úµã½ÓÊܵ½pingÃüÁîºó£¬»á·µ»ØÒ»¸öpong×Ö·û´®¡£
ͶƱ»úÖÆ£ºÈç¹ûÒ»¸ö½ÚµãA¸ø½ÚµãB·¢ËÍpingûÓеõ½pong·µ»Ø£¬»á֪ͨÆäËû½ÚµãÔٴθøB·¢ËÍping£¬Èç¹û¼¯ÈºÖÐÓг¬¹ýÒ»°ëµÄ½ÚµãÊÕ²»B½ÚµãµÄpong¡£ÄÇô¾ÍÈÏΪB½Úµã¹ÒÁË¡£Ò»°ã»áΪÿ¸ö½ÚµãÌṩһ¸ö±¸·Ý½Úµã£¬Èç¹û¹Òµô»áÇл»µ½±¸·Ý½Úµã¡£
2¡¢Redis¼¯Èº´æ´¢ÔÀí
Redis¶ÔÓÚÿ¸ö´æ·ÅµÄkey»á½øÐÐhash²Ù×÷£¬Éú³ÉÒ»¸ö[0-16384]µÄhashÖµ£¨ÏȽøÐÐ
crc Ëã·¨ÔÙ¶Ô16384È¡Óࣩ¡£
¼¯ÈºµÄÇé¿öÏ£¬¾ÍÊǰÑ[0-16384]µÄÇø¼ä½øÐвð·Ö£¬·Åµ½²»Í¬µÄredisÖС£
3¡¢RedisµÄ³Ö¾Ã»¯
Snapshotting£º¶¨Ê±µÄ½«RedisÄÚ´æÖеÄÊý¾Ý±£´æµ½Ó²ÅÌÖÐ
AOF£º½«ËùÓеÄcommand²Ù×÷±£´æµ½aofÖУ¬AOPµÄͬ²½ÆµÂʺܸߣ¬Êý¾Ý¼´Ê¹¶ªÊ§£¬Á£¶ÈÒ²ºÜС£¬µ«»áÔÚÐÔÄÜÉÏÔì³ÉÓ°Ïì¡£
¶þ¡¢Redis¼¯Èº×¼±¸¹¤×÷
Redis°²×°
Ô´ÂëÏÂÔØ
ÏÂÔØµØÖ·https://pan.baidu.com/s/1bCcLv4 ÃÜÂëi5k6
½âѹԴÂë
tar -zxvf redis-3.0.0.tar.gz
½øÈë½âѹºóµÄĿ¼½øÐбàÒë
cd /usr/local/redis-3.0.0
make
°²×°µ½Ö¸¶¨Ä¿Â¼,Èç /usr/local/redis
cd /usr/local/redis-3.0.0
make PREFIX=/usr/local/redis install
nredis.conf
redis.confÊÇredisµÄÅäÖÃÎļþ£¬redis.confÔÚredisÔ´ÂëĿ¼¡£
×¢ÒâÐÞ¸Äport×÷Ϊredis½ø³ÌµÄ¶Ë¿Ú,portĬÈÏ6379¡£
¿½±´ÅäÖÃÎļþµ½°²×°Ä¿Â¼ÏÂ
½øÈëÔ´ÂëĿ¼£¬ÀïÃæÓÐÒ»·ÝÅäÖÃÎļþ redis.conf£¬È»ºó½«Æä¿½±´µ½°²×°Â·¾¶ÏÂ
cd /usr/local/redis
mkdir conf
cp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin
ÔËÐУºbin/redis-server ½«³öÏÖÏÂͼ»Ã棺
RedisĬÈÏÊÇǰ̨ÔËÐеģ¬¿ÉÒÔÐÞ¸Äredis.confµÄdaemonize yes £¬½«Æä±ä³Éºǫ́ÔËÐС£
¼¯Èº»·¾³´î½¨
redis¼¯Èº¹ÜÀí¹¤¾ßredis-trib.rbÒÀÀµruby»·¾³£¬Ê×ÏÈÐèÒª°²×°ruby»·¾³
°²×°ruby
yum install ruby
yum install rubygems |
°²×°rubyºÍredisµÄ½Ó¿Ú³ÌÐò
¿½±´redis-3.0.0.gemÖÁ/usr/localÏÂ
Ö´ÐУº
gem install
/usr/local/redis-3.0.0.gem |
Èý¡¢´´½¨Redis¼¯Èº
ÔÚһ̨·þÎñÆ÷ÉÏ£¬¿ÉÒÔÓò»Í¬¶Ë¿ÚºÅÀ´±íʾ²»Í¬redis·þÎñÆ÷¡£
Redis¼¯Èº×îÉÙÐèÒªÈý̨·þÎñÆ÷£¬¶øÃ¿Ì¨·þÎñÆ÷ÓÐÐèÒª±¸Ó÷þÎñÆ÷£¬ËùÒÔ×îÉÙÐèÒª6̨·þÎñÆ÷¡£¶Ë¿Ú¹æ»®ÈçÏ£º
Ö÷·þÎñÆ÷£º192.168.100.66 :7001 :7002 :7003
´Ó·þÎñÆ÷£º192.168.100.66 :7004 :7005 :7006
ÔÚ/usr/local ´´½¨Îļþ¼ÐÓÃÀ´´æ·Å·þÎñÆ÷³ÌÐò
mkdir 7001 7002 7003 7004 7005 7006
Èç¹ûÏëÈÃredisÖ§³Ö¼¯ÈºÐèÒªÐÞ¸Äredis.configÅäÖÃÎļþµÄcluster-enabled
yes
±¾ÀýÖÐÎÒÃÇÒÔ¶Ë¿ÚÀ´Çø±ð²»Í¬µÄredis·þÎñ£¬ËùÒÔ»¹ÐèÒªÐÞ¸Äredis.configµÄportΪ¶ÔÓ¦¶Ë¿Ú
ÐÞ¸ÄÍêÅäÖÃÎļþ£¬½«redis°²×°Ä¿Â¼µÄbin¸´ÖƵ½ÉÏÃæÃ¿¸öĿ¼ÖС£
·Ö±ð½øÈë7001/bin/ 7002/bin .....
Æô¶¯·þÎñ./redis-server ./redis.conf
²é¿´redis½ø³Ì£ºps -aux|grep redis ÈçÏÂͼÔò˵Ã÷Æô¶¯³É¹¦
´´½¨¼¯Èº£º
½«Ö®Ç°½âѹµÄÎļþ¼ÐµÄredis-3.0.0/src/redis-trib.rb¸´ÖƵ½redis-clusterĿ¼
ÔËÐÐ
./redis-trib.rb
create --replicas 1 192.168.100.66:7001 192.168.100.66:7002
192.168.100.66:7003 192.168.100.66:7004 192.168.100.66:7005
192.168.100.66:7006 |
Èç¹ûÖ´ÐÐʱ±¨ÈçÏ´íÎó£º
[ERR] Node XXXXXX
is not empty. Either the node already knows other
nodes (check with CLUSTER NODES) or contains some
key in database 0 |
½â¾ö·½·¨ÊÇɾ³ýÉú³ÉµÄÅäÖÃÎļþnodes.conf£¬Èç¹û²»ÐÐÔò˵Ã÷ÏÖÔÚ´´½¨µÄ½áµã°üÀ¨Á˾ɼ¯ÈºµÄ½áµãÐÅÏ¢£¬ÐèҪɾ³ýredisµÄ³Ö¾Ã»¯ÎļþºóÔÙÖØÆôredis£¬±ÈÈ磺appendonly.aof¡¢dump.rdb
Èç¹û³É¹¦×îÖÕÊäÈëÈçÏ£º
²éѯ¼¯ÈºÐÅÏ¢£º

˵Ã÷£º
./redis-cli -c -h 192.168.101.3 -p 7001 £¬ÆäÖÐ-c±íʾÒÔ¼¯Èº·½Ê½Á¬½Óredis£¬-hÖ¸¶¨ipµØÖ·£¬-pÖ¸¶¨¶Ë¿ÚºÅ
cluster nodes ²éѯ¼¯Èº½áµãÐÅÏ¢
cluster info ²éѯ¼¯Èº×´Ì¬ÐÅÏ¢
hash²ÛÖØÐ·ÖÅä
µÚÒ»²½£ºÁ¬½ÓÉϼ¯Èº
./redis-trib.rb reshard 192.168.101.3:7001£¨Á¬½Ó¼¯ÈºÖÐÈÎÒâÒ»¸ö¿ÉÓýáµã¶¼ÐУ©
µÚ¶þ²½£ºÊäÈëÒª·ÖÅäµÄ²ÛÊýÁ¿
ÊäÈë 500±íʾҪ·ÖÅä500¸ö²Û
µÚÈý²½£ºÊäÈë½ÓÊղ۵Ľáµãid
ÕâÀï×¼±¸¸ø7007·ÖÅä²Û£¬Í¨¹ýcluster nodes²é¿´7007½áµãidΪ15b809eadae88955e36bcdbb8144f61bbbaf38fb
ÊäÈ룺15b809eadae88955e36bcdbb8144f61bbbaf38fb
µÚËIJ½£ºÊäÈëÔ´½áµãid
ÕâÀïÊäÈëall
µÚÎå²½£ºÊäÈëyes¿ªÊ¼Òƶ¯²Ûµ½Ä¿±ê½áµãid
Ìí¼Ó´Ó½Úµã
¼¯Èº´´½¨³É¹¦ºó¿ÉÒÔÏò¼¯ÈºÖÐÌí¼Ó½Úµã£¬ÏÂÃæÊÇÌí¼ÓÒ»¸öslave´Ó½Úµã¡£
Ìí¼Ó7008´Ó½áµã£¬½«7008×÷Ϊ7007µÄ´Ó½áµã¡£
./redis-trib.rb add-node --slave --master-id Ö÷½Úµãid
Ìí¼Ó½ÚµãµÄipºÍ¶Ë¿Ú ¼¯ÈºÖÐÒÑ´æÔÚ½ÚµãipºÍ¶Ë¿Ú
Ö´ÐÐÈçÏÂÃüÁ
./redis-trib.rb
add-node --slave --master-id cad9f7413ec6842c971dbcc2c48b4ca959eb5db4
192.168.101.3:7008 192.168.101.3:7001 |
cad9f7413ec6842c971dbcc2c48b4ca959eb5db4 ÊÇ7007½áµãµÄid£¬¿Éͨ¹ýcluster
nodes²é¿´¡£
×¢Ò⣺Èç¹ûÔÀ´¸Ã½áµãÔÚ¼¯ÈºÖеÄÅäÖÃÐÅÏ¢ÒѾÉú³Écluster-config-fileÖ¸¶¨µÄÅäÖÃÎļþÖУ¨Èç¹ûcluster-config-fileûÓÐÖ¸¶¨ÔòĬÈÏΪnodes.conf£©£¬Õâʱ¿ÉÄܻᱨ´í£º
[ERR] Node XXXXXX is not empty. Either the node already
knows other nodes (check with CLUSTER NODES) or contains
some key in database 0
½â¾ö·½·¨ÊÇɾ³ýÉú³ÉµÄÅäÖÃÎļþnodes.conf£¬É¾³ýºóÔÙÖ´ÐÐ./redis-trib.rb add-nodeÖ¸Áî
²é¿´¼¯ÈºÖеĽáµã£¬¸ÕÌí¼ÓµÄ7008Ϊ7007µÄ´Ó½Úµã£º
1.1. ɾ³ý½áµã£º
./redis-trib.rb
del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017 |
ɾ³ýÒѾռÓÐhash²ÛµÄ½áµã»áʧ°Ü£¬±¨´íÈçÏ£º
[ERR] Node 127.0.0.1:7005
is not empty! Reshard data away and try again. |
ÐèÒª½«¸Ã½áµãÕ¼ÓõÄhash²Û·ÖÅä³öÈ¥£¨²Î¿¼hash²ÛÖØÐ·ÖÅäÕ½ڣ©¡£
²âÊÔ:
Maven:
<dependencies>
<dependency> <groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version> </dependency>
<!-- https://mvnrepository.com/artifact/junit/junit
--> <dependency> <groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version> <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact /org.springframework/spring-test
--> <dependency> <groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.10.RELEASE</version>
<scope>test</scope> </dependency>
</dependencies> |
ÆÕͨ²âÊÔ£º
@Test
public void redisClusterTest1(){
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(30);
config.setMaxIdle(2);
Set<HostAndPort> jedisNode=new HashSet<HostAndPort>();
jedisNode.add(new HostAndPort("192.168.100.66",7001));
jedisNode.add(new HostAndPort("192.168.100.66",7002));
jedisNode.add(new HostAndPort("192.168.100.66",7003));
jedisNode.add(new HostAndPort("192.168.100.66",7004));
jedisNode.add(new HostAndPort("192.168.100.66",7005));
jedisNode.add(new HostAndPort("192.168.100.66",7006));
JedisCluster jc=new JedisCluster(jedisNode,config);
jc.set("name","ÀÏÍõ");
String value=jc.get("name");
System.out.println(value);
} |
Spring²âÊÔ£º
ÅäÖÃÎļþ£º
<?xml version="1.0"
encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org
/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org
/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Á¬½Ó³ØÅäÖà --> <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.100.66">
</constructor-arg>
<constructor-arg index="1" value="7001">
</constructor-arg>
</bean> <bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.100.66">
</constructor-arg>
<constructor-arg index="1" value="7002"></constructor-arg>
</bean> <bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.100.66"></constructor-arg>
<constructor-arg index="1" value="7003"></constructor-arg>
</bean> <bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.100.66"></constructor-arg>
<constructor-arg index="1" value="7004"></constructor-arg>
</bean> <bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.100.66"></constructor-arg>
<constructor-arg index="1" value="7005"></constructor-arg>
</bean> <bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.100.66"></constructor-arg>
<constructor-arg index="1" value="7006"></constructor-arg>
</bean> </set> </constructor-arg>
<constructor-arg index="1" ref="jedisPoolConfig"></constructor-arg>
</bean>
</beans> |
²âÊÔÀࣺ
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-config.xml"})
public class RedisClusterTest {
@Autowired
private JedisCluster jedisCluster;
@Test
public void redisClusterTest2(){
jedisCluster.set("username","СÃ÷À²À²");
String name=jedisCluster.get("username");
System.out.println(name);
}
} |
|