Redis的集群搭建与Redis与spring整合

集群: 高可用,满足高并发, 把数据分布在不同的节点上,提高单个节点的性能

1.redis集群

架构细节 :
(1) 所有的 redis 节点彼此互联 (PING-PONG 机制 ), 内部使用二进制协议优化传输速度和带宽 .
(2) 节点的 fail 是通过集群中超过半数的节点检测失效时才生效 .
(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 会根据节点数量大致均等的将哈希槽映射到不同的节点
集群中应该至少有三个节点,每个节点有一备份节点。需要6台服务器。
搭建伪分布式,需要6个redis实例。

2.搭建集群的步骤:

1.正常安装后在redis.conf 文件中修改配置:
2.修改端口号: 创建 6 redis 实例指定端口(如从 7001 7006)
3.修改集群策略: 修改 redis.conf 打开 Cluster-enable yes 前面的注释。
4. 需要一个 ruby 脚本。在 redis 源码文件夹下的 src 目录下。 redis-trib.rb
5. redis-trib.rb 文件复制到 redis-cluster 目录下。
6.执行 ruby 脚本之前,需要安装 ruby 环境。
1 yum install ruby
2 yum install rubygems
3 、安装 redis-trib.rb 运行依赖的 ruby 的包。
  [root@bogon ~]# gem install redis-3.0.0.gem
7: 启动所有的redis 实例。
8:使用redis-trib.rb 创建集群。
./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005  192.168.25.153:7006
使用客户端连接集群: redis01/redis-cli -p 7001 -c
如何使用 redis java 客户端
需要使用 Jedis 连接 redis 服务器。

3.集群版使用Jedis

@Test
     public void testJedisCluster() throws Exception {
          //创建一个JedisCluster对象
          Set< HostAndPort > nodes = new HashSet<>();
          nodes .add( new HostAndPort ( "192.168.25.153" , 7001));
          nodes .add( new HostAndPort ( "192.168.25.153" , 7002));
          nodes .add( new HostAndPort ( "192.168.25.153" , 7003));
          nodes .add( new HostAndPort ( "192.168.25.153" , 7004));
          nodes .add( new HostAndPort ( "192.168.25.153" , 7005));
          nodes .add( new HostAndPort ( "192.168.25.153" , 7006));
          //在nodes中指定每个节点的地址
          //jedisCluster在系统中是单例的。
          JedisCluster jedisCluster = new JedisCluster( nodes );
          jedisCluster .set( "name" , "zhangsan" );
          jedisCluster .set( "value" , "100" );
          String name = jedisCluster .get( "name" );
          String value = jedisCluster .get( "value" );
          System. out .println( name );
          System. out .println( value );   
          //系统关闭时关闭jedisCluster
          jedisCluster .close();
     }

4.项目中使用jedis

思路:创建一个 redis 操作的接口。分别创建两个实现类对应 redis 的单机版和集群版。当使用单机版 redis 时,配置单机版的实现类,当使用集群版本的时候,配置集群版的实现类。
单机版: 见java操作redis
集群版:
public class JedisClientCluster implements JedisClient {
     @Autowired
     private JedisCluster jedisCluster ;
     @Override
     public String set(String key , String value ) {
          return jedisCluster .set( key , value );
     }
     @Override
     public String get(String key ) {
          return jedisCluster .get( key );
     }
     @Override
     public Long hset(String key , String item , String value ) {
          return jedisCluster .hset( key , item , value );
     }
     @Override
     public String hget(String key , String item ) {
          return jedisCluster .hget( key , item );
     }
     @Override
     public Long incr(String key ) {
          return jedisCluster .incr( key );
     }
     @Override
     public Long decr(String key ) {
          return jedisCluster .decr( key );
     }
     @Override
     public Long expire(String key , int second ) {
          return jedisCluster .expire( key , second );
     }
     @Override
     public Long ttl(String key ) {
          return jedisCluster .ttl( key );
     }
}

5.Redis的Spring的配置

    
     < context:component-scan base-package = "com.taotao.rest.service" > context:component-scan >
     
     < bean id = "jedisPool" class = "redis.clients.jedis.JedisPool" >
          < constructor-arg name = "host" value = "192.168.25.153" > constructor-arg >
          < constructor-arg name = "port" value = "6379" > constructor-arg >
     bean >
    
     < bean id = "jedisClientSingle" class = "com.taotao.rest.component.impl.JedisClientSingle" />
    
    
    
beans >
测试:
public void testJedisClientSpring() throws Exception {
          //创建一个spring容器
          ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "classpath:spring/applicationContext-*.xml" );
          //从容器中获得JedisClient对象
          JedisClient jedisClient = applicationContext .getBean(JedisClient. class );
          //jedisClient操作 redis
          jedisClient .set( "cliet1" , "1000" );
          String string = jedisClient .get( "cliet1" );
          System. out .println( string );
 }

你可能感兴趣的:(数据库)