docker-compose.yml
创建docker-compose.yml
文件:
version: '3.8'
networks:
app-tier:
driver: bridge
services:
redis-master:
image: bitnami/redis:latest
container_name: redis-master
networks:
- app-tier
environment:
- REDIS_PASSWORD=123
- ALLOW_EMPTY_PASSWORD=no
ports:
- "6379:6379"
redis-slave:
image: bitnami/redis:latest
container_name: redis-slave
networks:
- app-tier
depends_on:
- redis-master
environment:
- REDIS_REPLICATION_MODE=slave
- REDIS_MASTER_HOST=redis-master
- REDIS_MASTER_PORT_NUMBER=6379
- REDIS_MASTER_PASSWORD=123
- REDIS_PASSWORD=123
- ALLOW_EMPTY_PASSWORD=no
ports:
- "6380:6379"
redis-sentinel-1:
image: bitnami/redis-sentinel:latest
container_name: redis-sentinel-1
networks:
- app-tier
depends_on:
- redis-master
- redis-slave
environment:
- REDIS_MASTER_NAME=mymaster
- REDIS_MASTER_HOST=127.0.0.1
- REDIS_MASTER_PORT_NUMBER=6379
- REDIS_MASTER_PASSWORD=123
- REDIS_SENTINEL_QUORUM=2
- ALLOW_EMPTY_PASSWORD=no
ports:
- "26379:26379"
redis-sentinel-2:
image: bitnami/redis-sentinel:latest
container_name: redis-sentinel-2
networks:
- app-tier
depends_on:
- redis-master
- redis-slave
environment:
- REDIS_MASTER_NAME=mymaster
- REDIS_MASTER_HOST=127.0.0.1
- REDIS_MASTER_PORT_NUMBER=6379
- REDIS_MASTER_PASSWORD=123
- REDIS_SENTINEL_QUORUM=2
- ALLOW_EMPTY_PASSWORD=no
ports:
- "26380:26379"
redis-sentinel-3:
image: bitnami/redis-sentinel:latest
container_name: redis-sentinel-3
networks:
- app-tier
depends_on:
- redis-master
- redis-slave
environment:
- REDIS_MASTER_NAME=mymaster
- REDIS_MASTER_HOST=127.0.0.1
- REDIS_MASTER_PORT_NUMBER=6379
- REDIS_MASTER_PASSWORD=123
- REDIS_SENTINEL_QUORUM=2
- ALLOW_EMPTY_PASSWORD=no
ports:
- "26381:26379"
启动Docker Compose服务
确保你在正确的目录中,并运行以下命令启动所有服务:
docker-compose up -d
验证服务状态
使用以下命令查看所有容器的状态:
docker-compose ps
从宿主机连接到Redis哨兵
使用Redis CLI从宿主机连接到Redis哨兵:
redis-cli -p 26379 -a 123
在Redis CLI中执行命令
在连接到哨兵CLI后,执行以下命令以查询主节点地址:
127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
1) "127.0.0.1"
2) "6379"
127.0.0.1:26379>
在代码中使用哨兵
package com.github.xiaolyuh.config;
import com.github.xiaolyuh.redis.clinet.RedisClient;
import com.github.xiaolyuh.redis.clinet.RedisProperties;
import com.github.xiaolyuh.redis.clinet.SentinelRedisClient;
import com.github.xiaolyuh.redis.serializer.FastJsonRedisSerializer;
import com.github.xiaolyuh.redis.serializer.JacksonRedisSerializer;
import com.github.xiaolyuh.redis.serializer.JdkRedisSerializer;
import com.github.xiaolyuh.redis.serializer.KryoRedisSerializer;
import com.github.xiaolyuh.redis.serializer.ProtostuffRedisSerializer;
import com.github.xiaolyuh.redis.serializer.StringRedisSerializer;
import com.github.xiaolyuh.util.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource({"classpath:application.properties"})
public class RedisSentinelConfig {
@Value("${layering-cache.redis.nodes:127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381}")
private String nodes;
@Value("${spring.redis.password:123}")
private String password;
@Bean
public RedisClient layeringCacheRedisClient() {
RedisProperties redisProperties = new RedisProperties();
redisProperties.setSentinelNodes(nodes);
redisProperties.setPassword(StringUtils.isBlank(password) ? null : password);
KryoRedisSerializer kryoRedisSerializer = new KryoRedisSerializer();
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer();
JacksonRedisSerializer jacksonRedisSerializer = new JacksonRedisSerializer();
JdkRedisSerializer jdkRedisSerializer = new JdkRedisSerializer();
ProtostuffRedisSerializer protostuffRedisSerializer = new ProtostuffRedisSerializer();
StringRedisSerializer keyRedisSerializer = new StringRedisSerializer();
SentinelRedisClient redisClient = new SentinelRedisClient(redisProperties);
redisClient.setKeySerializer(keyRedisSerializer);
redisClient.setValueSerializer(protostuffRedisSerializer);
return redisClient;
}
}