使用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)。下面是一个示例图。
我正在参考以下文章中使用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。
我将使其能在以下的图像中动起来。
本次确认的操作是通过在 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集群机制