使用Spring操作通过docker-compose启动的redis-cluster

首先

考虑到本次开发环境中经常使用docker-compose来配置环境,我打算写一下关于如何在spring中使用docker-compose上的redis-cluster的方法。
希望能够熟练地使用redis。

首先,我們將提供有關我們使用的環境以及所編寫的程式碼的詳細資訊。至於執行步驟,將在最後一起進行。

运行环境

Redis版本6.0.10
Spring版本5.0.0
Docker版本19.03.13

.
├── RedisPractice(springのプロジェクト)
│   
├── conf
│   ├── redis.conf
│   └── redis.sh
└── docker-compose.yml

环境建设

春天

我会将以下内容添加到pox.xml中,请特别确保在这里安装Jedis。Jedis是用于Java使用redis的库的。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

Docker Compose的内容

未来,我想要管理多个服务,所以我会使用docker-compose来启动redis-cluster。
我希望建立docker网络,并在其中进行管理。

version: '3'

services:
  redis:
    image: "redis:latest"
    command: bash -c "/bin/bash /conf/redis.sh  && while true; do echo "up"; sleep 100; done"
    ports:
        - 7000:7000
        - 7001:7001
        - 7002:7002
        - 7003:7003
        - 7004:7004
        - 7005:7005
    volumes:
      - "./conf:/conf:"

    networks:
            app_net:
                ipv4_address: 172.16.239.10

networks:
    app_net:
        driver: bridge
        ipam:
            driver: default
            config:
                - subnet: 172.16.239.0/24
                  gateway: 172.16.239.1

在Docker中,使用桥接(bridge)方式连接网络,并在其中创建子网(172.16.239.0)。下面是一个示例图。

image.png

我正在参考以下文章中使用bridge进行解释的图表进行制作。
https://qiita.com/TsutomuNakamura/items/ed046ee21caca4a2ffd9
参考网站:Docker网络概论

运行docker-compose up会启动docker-compose,并在redis容器内执行redis.sh。
下面是挂载到redis容器的内容以及要执行的内容。

启动Redis集群的文件们

以下的文章非常清楚地解释了关于Redis集群的内容。请阅读一下,非常容易理解。
https://qiita.com/keitatata/items/44678ad472e61a4606c5
参考网站:[实演]彻底理解Redis集群的机制。

以下是有关在Redis容器中挂载的内容以及要执行的内容的说明。下面的tree中的内容将解释有关conf的信息。

.
├── RedisPractice(springのプロジェクト)
│   
├── conf(このディレクトリの説明)
│   ├── redis.conf
│   └── redis.sh
└── docker-compose.yml

使用docker-compose up命令会启动docker-compose,并在redis容器内执行redis.sh脚本。简言之,

每个端口上的Redis服务器都将根据/conf/redis.conf文件中的设置在后台启动。
在此期间,集群信息将被写入/conf/nodes.700_ .conf文件。
然后,Redis服务器的配置信息将被写入/conf/r700_i.log。
最后,建立集群并为每个节点分配最少几个复制品。

是的。

redis-server /conf/redis.conf --port 7000 --cluster-config-file /conf/nodes.7000.conf --daemonize yes ;
redis-server /conf/redis.conf --port 7001 --cluster-config-file /conf/nodes.7001.conf --daemonize yes ;
redis-server /conf/redis.conf --port 7002 --cluster-config-file /conf/nodes.7002.conf --daemonize yes ;
redis-server /conf/redis.conf --port 7003 --cluster-config-file /conf/nodes.7003.conf --daemonize yes ;
redis-server /conf/redis.conf --port 7004 --cluster-config-file /conf/nodes.7004.conf --daemonize yes ;
redis-server /conf/redis.conf --port 7005 --cluster-config-file /conf/nodes.7005.conf --daemonize yes ;


redis-cli -p 7000 info 1> /conf/r7000i.log 2> /dev/null;
redis-cli -p 7001 info 1> /conf/r7001i.log 2> /dev/null;
redis-cli -p 7002 info 1> /conf/r7002i.log 2> /dev/null;
redis-cli -p 7003 info 1> /conf/r7003i.log 2> /dev/null;
redis-cli -p 7004 info 1> /conf/r7004i.log 2> /dev/null;
redis-cli -p 7005 info 1> /conf/r7005i.log 2> /dev/null;


yes "yes" | redis-cli --cluster create 172.16.239.10:7000 172.16.239.10:7001 172.16.239.10:7002 172.16.239.10:7003 172.16.239.10:7004 172.16.239.10:7005 --cluster-replicas 1;

以下是Redis服务器的配置文件。
虽然全部都很重要,但过去曾经因为没有指定cluster-announce-ip而遇到麻烦。如果可以的话,请看一下下面的文章。
https://qiita.com/hudebakononaka/items/bb6376818075b951d5b7


cluster-enabled      yes
cluster-node-timeout 5000
bind 0.0.0.0

cluster-announce-ip  127.0.0.1

准备在Spring中操作Redis。

我将使其能在以下的图像中动起来。

スクリーンショット 2021-02-20 16.04.29.png

本次确认的操作是通过在 GET 参数中添加值来保存数据。

我在下方放置了Spring的代码。

关于Spring对Redis的操作,可以参考Spring Data Redis文档。
https://spring.pleiades.io/spring-data/redis/docs/2.3.6.RELEASE/reference/html/#redis:template
参考网站:Spring文档

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RedisController {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @RequestMapping(value="/redis/{key}/{value}" ,method = RequestMethod.GET)
    public String registerRedisServer( @PathVariable("key")String redisKey , @PathVariable("value") String redisValue) {

        //文字列操作をする場合はrg.springframework.data.redis.core のValueOperationsを使用する
        ValueOperations<String, String> stringOoperation  = redisTemplate.opsForValue();
        stringOoperation.set(redisKey, redisValue);


        return "{"+ redisKey +":"+ redisValue +"}";
    }

}

Config文件的代码是参考以下文章的:

参考网站:将Spring Boot 1.5.x的Web应用升级到2.0.x(第19部分)(在Docker中构建Redis环境2(Redis集群配置))。

import java.util.List;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;

import lombok.Data;

@Data
@Configuration
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class RedisConfig {

     List<String> nodes;

     @Bean
     public RedisConnectionFactory connectionFactory() {
         return new JedisConnectionFactory(new RedisClusterConfiguration(nodes));
     }

}

spring:
  redis:
    cluster:
      nodes: 127.0.0.1:7000,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
      max-redirects: 9

执行步骤 (shí

请在包含docker-compose.yml文件的目录中执行以下操作。

$ docker-compose up -d

请使用上述代码启动Spring。
然后执行以下操作。

curl localhost:8080/redis/yes/nonono 

执行上述内容后,应该会在Redis服务器中保存该值。我们来试一下。

$ docker exec -it redi_redis_1 bash
# redis-cli -p 7000
127.0.0.1:7000> get "yes"
(error) MOVED 15538 127.0.0.1:7002
127.0.0.1:7000> CTRL+C
# redis-cli -p 7002
127.0.0.1:7002> get "yes"
"nonono"

就像这样,端口7002保存了一个键值对,键为”yes”,值为”nonono”。

以后想要尝试的事情

考虑到在开发环境中使用docker-compose来搭建环境的频率较高,本文介绍了如何使用docker-compose来使用redis-cluster。下一篇文章将考虑更接近生产环境的方式,尝试将redis-cluster部署在kubernetes上以提高可用性。

这次的代码

我在我的 GitHub 上有代码,如果有需要的话,请随意使用。
https://github.com/Kota-Yamaguchi/redisPractice

请提供必要的参考文献。

参考网站:Spring文档

(Translation: Reference website: Spring documentation)

参考网站:将Spring Boot 1.5.x的Web应用程序升级到2.0.x(第19部分)(使用Docker构建Redis环境2(Redis Cluster配置))。

参考网站:Docker网络概述

参考网站:[实况演示]充分理解Redis集群机制

广告
将在 10 秒后关闭
bannerAds