安装docker就不说了,直接开始正题。
一.Docker搭建redis集群
1.linux开放需要的端口(此次安装用如下接口),如无法执行,请打开linux的防火墙
1.1打开防火墙命令:
systemctl start firewalld
1.2开放需要的端口
firewall-cmd --permanent --zone=public --add-port=7000-7005/tcp
firewall-cmd --permanent --zone=public --add-port=17000-17005/tcp
#重新加载配置
firewall-cmd --reload
#查看开放的端口
firewall-cmd --permanent --zone=public --list-ports
2.下载redis镜像
docker pull redis
3.创建linux中redis容器集群文件夹(进入目录:cd /data/redis-cluster)
mkdir -p /data/redis-cluster
4.创建redis的配置模板文件:redis-cluster.tmpl(用于生成redis.conf)
vim redis-cluster.tmpl
4.1.如下是redis-cluster.tmpl内容
##节点端口
port ${PORT}
##开启集群模式
protected-mode no
##cluster集群模式
cluster-enabled yes
##集群配置名
cluster-config-file nodes.conf
##超时时间
cluster-node-timeout 5000
##集群的中各个容器的ip地址
cluster-announce-ip 192.168.10.13
##节点映射端口
cluster-announce-port ${PORT}
##节点总线端口
cluster-announce-bus-port 1${PORT}
##持久化模式
appendonly yes
5.在/data/redis-cluster下生成redis的conf和data目录,并生成redis.conf配置文件
for port in `seq 7000 7005`; do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done
5.1创建后如下图:
6.创建6个redis容器并启动
for port in `seq 7000 7005`; do \
sudo docker run -d --net host --privileged=true \
-v $PWD/${port}/conf/redis.conf:/data/redis/redis-${port}.conf \
-v $PWD/${port}/data:/data \
--restart always --name redis-${port} \
redis redis-server /data/redis/redis-${port}.conf; \
done
6.1查询看正在运行的6个redis容器:docker ps
7.随便进入一个redis容器
docker exec -it redis-7000 bash
8.创建cluster集群
redis-cli --cluster create 192.168.1.76:7000 192.168.1.76:7001 192.168.1.76:7002 192.168.1.76:7003 192.168.1.76:7004 192.168.1.76:7005 --cluster-replicas 1
9.这时如果如下图就说明成功
10.如果要重新创建集群,删掉docker镜像,删掉redis-cluster目录下的所有“文件夹”,然后重新从第5步开始即可。
10.1.批量删除镜像命令
for port in `seq 7000 7005`; do \
docker stop redis-${port};
docker rm redis-${port};
done
注意事项:如果是阿里云服务器需要本地机器访问的话,需要在安全策略中打开17001至17005的6个端口,同时创建集群时其中的ip地址必须是外网,否则无法本地访问。
二 . SpringBoot整合Redis
1.引入依赖
<!--redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
<!-- lettuce pool 缓存连接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.9.0</version>
</dependency>
2.创建java文件,初始化Redis配置,解决乱码等问题
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 使用Jackson2JsonRedisSerialize 替换默认的jdkSerializeable序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
3.更改配置文件
#redis集群配置
spring.redis.timeout=5000
spring.redis.cluster.max-redirects=3
spring.redis.cluster.lettuce.pool.max-idle=10
spring.redis.cluster.lettuce.pool.max-wait=5000
spring.redis.cluster.lettuce.pool.max-active=200
spring.redis.cluster.lettuce.pool.min-idle=3
spring.redis.cluster.nodes=192.196.51.38:7000,192.196.51.38:7001,192.196.51.38:7002,192.196.51.38:7003,192.196.51.38:7004,192.196.51.38:7005
4.用法,也可以自己写一个工具类
@Autowired
private RedisTemplate<String,Object> redisTemplate;
//插入值
redisTemplate.opsForValue().set(key, value);