redis集群,顾名思义的就是由多台redis服务器,作为一个整体,为系统进行服务,redis集群是一个无中心化的一种服务模式,在redis集群中,由多组主从模式的简单集群共同组件成一个大的redis集群,集群中共同维护16384个slot(插槽),相对比而言,redis集群比主从复制,哨兵模式增加了写的能力,容错性能更强。下边开始搭建
1、准备配置文件redis6379.conf、redis6380.conf、redis6381.conf、redis6389.conf、redis6390.conf、redis6391.conf,此种配置文件在搭建集群的时候,会分为三组主从模式的简单集群,前三台为主机(master),后三个分别为从机(slave)。配置内容如下:
# 引入公共的配置部分
include ./redis.conf
#设置pid文件位置
pidfile ./redis_6379.pid
# 设置端口号
port 6379
# 设置rdb文件名称
dbfilename "dump6379.rdb"
# 以下是集群配置相关餐宿
# 开启集群模式
cluster-enabled yes
# 设置节点集群配置信息文件名称
cluster-config-file nodes-6379.conf
# 节点超时时间
cluster-node-timeout 15000
所有配置文件公共部分内容相同,只是需要修改端口和文件名称为指定的配置信息
2、启动各个节点
./redis-server XXX.conf
3、执行命令
进入到安装是编译redis的文件路径的src目录下
*/redis-5.0.9/src,使用redis-cli执行
注意:在高版本中,已经继承了ruby环境,如果低版本的,需要自己安装ruby环境
./redis-cli --cluster create --cluster-replicas 1 -a lixl123 192.168.1.35:6379 192.168.1.35:6380 192.168.1.35:6381 192.168.1.35:6389 192.168.1.35:6390 192.168.1.35:6391
命令中的 1 代表使用简单模式创建集群
-a 代表密码
创建成功!
连接集群时候,有些变化,再次切换到安装路径下
./redis-cli -c -p + 主节点端口号(集群中任意一个都可以)
使用命令cluster nodes可以查看集群信息
java使用redisTemplate连接redis集群也有所调整,默认redisTemplate是用了lettuce连接redis,这里使用jedis连接
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>spring-boot</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- 排除lettuce -->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入jedis相关的包 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件信息
server:
port: 8981
spring:
cache:
redis:
time-to-live: 10000
redis:
timeout: 5000
database: 0
password: lixl123
cluster:
nodes:
- 192.168.1.35:6379
- 192.168.1.35:6380
- 192.168.1.35:6381
- 192.168.1.35:6389
- 192.168.1.35:6390
- 192.168.1.35:6391
max-redirects: 3
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 8
min-idle: 0
配置类信息
@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;
}
测试方法
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestRedisController {
@Autowired
RedisTemplate redisTemplate;
@RequestMapping("/setRedis2")
public String setRedis2(@RequestParam(value = "key",required = false)String key,@RequestParam(value = "value",required = false)String value){
if (StringUtils.hasText(key)&&StringUtils.hasText(value)){
redisTemplate.opsForValue().set(key,value);
} else {
redisTemplate.opsForValue().set("name","lixl123");
}
return "true";
}
@RequestMapping("/getRedis2")
public String getRedis2(@RequestParam(value = "key",required = false)String key){
String result = "";
if (StringUtils.hasText(key)){
result = (String)redisTemplate.opsForValue().get(key);
} else {
result = (String)redisTemplate.opsForValue().get("name");
}
return result;
}
}
调用结果
tips:
cluster nodes 查看集群信息
cluster keyslot k1 #计算key的插槽值
cluster countkeysinslot + 插槽值 # 查看插槽内值的个数,只能查看自己服务器维护的插槽
cluster getkeysinslot + 插槽值 #返回插槽内的所有key
cluster-require-full-coverage: yes
当某个插槽的全部节点都宕机的情况下,整个集群将全部不能提供服务
如果该值设置为no,则宕机的插槽不能访问(读/写),其他插槽不受影响