Docker中实现redis分片

首先基于基础CentOS7或以上版本, 装好docker后,拉取最新redis版本,代码如下:

docker search redis         #镜像库提供的多个镜像
docker pull redis           #拉取最后版本的docker-redis镜像
docker pull redis:4.0.0     #拉取指定版本的redis镜像
docker images               #查看已经拉取的镜像

启动三个redis实例用以分片

docker run -d --name redis7000 -p 7000:6379 redis:0.0.1
docker run -d --name redis7001 -p 7001:6379 redis:0.0.1
docker run -d --name redis7002 -p 7002:6379 redis:0.0.1
#-d     : container将会运行在后台模式(detached mode)
#--name : 实例名称
#-p     : 对外程序访问端口7000,宿主机映射的redis端口6379,最后的redis为镜像的名称

在Linux中打开响应端口7000,7001,7002.代码如下:

(CentOS7)
systemctl stop firewalld.service        #关闭防火墙服务
disable firewalld.service               #禁止防火墙开启启动
systemctl restart iptables.service  #重启防火墙使配置生效
systemctl enable iptables.service   #设置防火墙开机启动
systemctl restart docker                #重启docker服务
或
(CentOS6)
iptables -I INPUT -p tcp --dport 7000 -j ACCEPT
iptables -I INPUT -p tcp --dport 7001 -j ACCEPT
iptables -I INPUT -p tcp --dport 7002 -j ACCEPT

查看docker实例

docker ps                               #查看当前运行的dockerid
docker ps -a                            #查看已有的可能状态是停止
docker start b193fbe1e400               #开启实例,如重启可能实例被关闭
docker stop b193fbe1e400                #停止实例
docker rm –f 0cfc4932b9a0               #删除运行的docker,-f强制删除
docker rmi  xcfc4932b9a0                #删除镜像

进入docker内部,代码如下 :

docker exec -it 0cfc4932b9a0 bash
#进入docker内部,-it输入输出,展示信息在控制台

编写java代码来测试下

package test;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

public class TestRedis {
    @Test   //完成单实例链接
    public void jedis(){
        Jedis jedis = new Jedis("192.168.80.38",7000);
        //jedis.auth("123456");
        jedis.set("name","tony");   //调用redis命令set
        String s = jedis.get("name");
        System.out.println(s);
        jedis.close();
    }
        @Test   //分片
        public void shard(){
            //构造各个节点链接信息,host和port
            List<JedisShardInfo> infoList = new ArrayList<JedisShardInfo>();
            JedisShardInfo info1 = new JedisShardInfo("192.168.80.22",7000);
            infoList.add(info1);
            JedisShardInfo info2 = new JedisShardInfo("192.168.80.22",7001);
            infoList.add(info2);
            JedisShardInfo info3 = new JedisShardInfo("192.168.80.22",7002);
            infoList.add(info3);

            //分片jedis
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(500);    //最大链接数

            ShardedJedisPool pool = new ShardedJedisPool(config, infoList);
            //ShardedJedis jedis = new ShardedJedis(infoList);
            ShardedJedis jedis = pool.getResource();    //从pool中获取
            for(int i=0;i<10;i++){
                jedis.set("n"+i, "t"+i);
            }
            System.out.println(jedis.get("n9"));
            jedis.close();
        }
    }

另附上redis配置文件:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    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-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

    <!-- 构建连接池配置信息 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大连接数 -->
        <property name="maxTotal" value="${redis.maxTotal}" />
    </bean>

    <bean id="jedisShardInfo1" class="redis.clients.jedis.JedisShardInfo">
        <constructor-arg index="0" value="${redis.node1.ip}" />
        <constructor-arg index="1" value="${redis.node1.port}"
            type="int" /><!-- 如果不声明类型,按字符串对待,调用格式就不对,默认赵6379端口 -->
    </bean>

    <bean id="jedisShardInfo2" class="redis.clients.jedis.JedisShardInfo">
        <constructor-arg index="0" value="${redis.node2.ip}" />
        <constructor-arg index="1" value="${redis.node2.port}"
            type="int" />
    </bean>

    <bean id="jedisShardInfo3" class="redis.clients.jedis.JedisShardInfo">
        <constructor-arg index="0" value="${redis.node3.ip}" />
        <constructor-arg index="1" value="${redis.node3.port}"
            type="int" />
    </bean>

    <!-- 定义集群连接池 -->
    <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool"
        destroy-method="close">
        <constructor-arg index="0" ref="jedisPoolConfig" />
        <constructor-arg index="1">
            <list>
                <ref bean="jedisShardInfo1" />
                <ref bean="jedisShardInfo2" />
                <ref bean="jedisShardInfo3" />
            </list>
        </constructor-arg>
    </bean>

</beans>

redis.properties

redis.maxTotal=50
redis.node1.ip=192.168.80.22
redis.node1.port=7000

redis.node2.ip=192.168.80.22
redis.node2.port=7001

redis.node3.ip=192.168.80.22
redis.node3.port=7002

猜你喜欢

转载自blog.csdn.net/zhangningkid/article/details/75249727