redis-cluster架构图

搭建Redis集群,Java操作redis(Demo:缓存数据库查询数据,当进行增删改方法时,删除缓存)

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽

(2)节点的fail是通过投票机制即集群中超过半数的节点检测失效时才生效

搭建Redis集群,Java操作redis(Demo:缓存数据库查询数据,当进行增删改方法时,删除缓存)

(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 会根据节点数量大致均等的将哈希槽映射到不同的节点

Redis集群的搭建

搭建资料

第一步:安装redis

tar zxvf redis-3.2.5.tar.gz
  • 复制:推荐放到usr/local目录下
sudo mv -r redis-3.2.3/* /usr/local/redis/
进入redis目录
cd /usr/local/redis/
  • 生成
sudo make
  • 测试
sudo make test
这段运行时间会较长,可以略过
  • 安装:将redis的命令安装到/usr/bin/目录
sudo make install

第二步:搭建伪Redis集群的准备工作

  • 使用命令生成可执行文件到指定目录下(因为需要6个可执行的redis-server)

sudo make install PREFIX=/usr/local/redis-cluster

  • 将/usr/local/redis目录下的redis.conf文件copy一份到刚生成的目录中,并修改该配置文件

搭建Redis集群,Java操作redis(Demo:缓存数据库查询数据,当进行增删改方法时,删除缓存)

搭建Redis集群,Java操作redis(Demo:缓存数据库查询数据,当进行增删改方法时,删除缓存)

  • 书写脚本运行所有6个redis

cd redis01
./redis-server redis.conf
cd ..

第三步:安装ruby和相关的包

  • 安装

 sudo apt-get install ruby

  • 安装redis-3.0.0.gem 

 sudo gem install redis-3.0.0.gem

  • 将/usr/local/redis/src目录下的redis-trib.rb文件copy到任意位置
  •  执行命令运行起来redis集群
./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
真正建立redis集群时,更改为运行redis主机们的ip地址(要关闭防火墙)

第四步:使用集群

redis-cli -p 7002 -c  # -c表示操作的是集群

Java操作redis

1、导入Jedis包

<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>

2、操作redis

1)直接操作版

@Test
public void JedisClient(){

    // 1.创建一个Jedis对象。需要指定服务端的ip及端口
    Jedis jedis = new Jedis("127.0.0.1", 6379);
    // 2.使用Jedis对象操作数据库
    jedis.set("k1","v1");
    String k1 = jedis.get("k1");
    System.out.println(k1);
    // 3.关闭Jedis对象
    jedis.close();

}

2)连接池版

@Test
public void JedisPool(){

    // 1.创建一个JedisPool对象。需要指定服务端的ip及端口
    JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
    // 2.从JedisPool中获得Jedis对象
    Jedis jedis = jedisPool.getResource();
    // 3.使用Jedis操作redis服务器
    jedis.set("k2","v2");
    String k1 = jedis.get("k2");
    System.out.println(k1);
    // 4.操作完毕后关闭jedis对象,连接池回收资源
    jedis.close();
    // 5.关闭JedisPool对象
    jedisPool.close();

}

3)连接集群版

@Test
// 集群默认使用的就是连接池,所以不用我们来配了
public void JedisCluster(){

    // 1.使用JedisCluster对象。需要一个Set<HostAndPort>参数。Redis节点的列表。
    Set<HostAndPort> nodes = new HashSet<>();
    nodes.add(new HostAndPort("127.0.0.1", 7001));
    nodes.add(new HostAndPort("127.0.0.1", 7002));
    nodes.add(new HostAndPort("127.0.0.1", 7003));
    nodes.add(new HostAndPort("127.0.0.1", 7004));
    nodes.add(new HostAndPort("127.0.0.1", 7005));
    nodes.add(new HostAndPort("127.0.0.1", 7006));

    // 2.直接使用JedisCluster对象操作redis。在系统中单例存在。
    JedisCluster jedisCluster = new JedisCluster(nodes);
    jedisCluster.set("k3", "v3");
    String result = jedisCluster.get("k3");
    System.out.println(result);
    // 3.系统关闭前,关闭JedisCluster对象。
    jedisCluster.close();

}

项目整合

缓存数据库查询数据,当进行增删改方法时,删除缓存;由于我们平时用单机版的就行了,项目发布时在使用集群版,所以我们可以采用面向接口编程;缓存是在service中配置的

 1 public interface JedisClient {
 2 
 3     String set(String key, String value);
 4     String get(String key);
 5     Boolean exists(String key);
 6     Long expire(String key, int seconds);
 7     Long ttl(String key);
 8     Long incr(String key);
 9     Long hset(String key, String field, String value);
10     String hget(String key, String field);
11     Long hdel(String key, String... field);
12     Boolean hexists(String key, String field);
13     List<String> hvals(String key);
14     Long del(String key);
15 }
Jedis操作的接口

相关文章:

  • 2021-05-22
  • 2021-06-19
  • 2021-04-14
  • 2021-06-12
  • 2021-04-10
猜你喜欢
  • 2021-11-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-17
  • 2021-12-04
  • 2021-09-05
相关资源
相似解决方案