Redis Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主节点,三个为从节点。三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点。
如上图所示,该集群中包含6个Redis节点3个主服务器3个从服务器,分别为M1,M2,M3,S1,S2,S3。除了主从 Redis 节点之间进行数据复制外,所有 Redis 节点之间采用 Gossip 协议进行通信,交换维护节点元数据信息。一般来说,主Redis节点会处理Clients的读写操作,而从节点只处理读操作。
搭建集群1.进入redis目录中,打开redis.conf文件,注释掉bind 127.0.0.1,bind自己服务器的IP。并将protected -mode yes改为no。daemonize 默认是no,需要改成yes,以守护进程运行。
2.分别创建6个conf文件对应不同的端口号,正常每个节点对应一台服务器,为了方便测试本次使用一台服务来搭建集群模式。
redis6379.conf
include redis.conf pidfile /var/run/redis_6379.pid port 6379 dbfilename dump6379.rdb cluster-enabled yes cluster-node-timeout 15000 cluster-config-file nodes-6379.conf
redis6380.conf
include redis.conf pidfile /var/run/redis_6380.pid port 6380 dbfilename dump6380.rdb cluster-enabled yes cluster-node-timeout 15000 cluster-config-file nodes-6380.conf
redis6381.conf
include redis.conf pidfile /var/run/redis_6381.pid port 6381 dbfilename dump6381.rdb cluster-enabled yes cluster-node-timeout 15000 cluster-config-file nodes-6381.conf
redis6389.conf
include redis.conf pidfile /var/run/redis_6389.pid port 6389 dbfilename dump6389.rdb cluster-enabled yes cluster-node-timeout 15000 cluster-config-file nodes-6389.conf
redis6390.conf
include redis.conf pidfile /var/run/redis_6390.pid port 6390 dbfilename dump6390.rdb cluster-enabled yes cluster-node-timeout 15000 cluster-config-file nodes-6390.conf
redis6391.conf
include redis.conf pidfile /var/run/redis_6391.pid port 6391 dbfilename dump6391.rdb cluster-enabled yes cluster-node-timeout 15000 cluster-config-file nodes-6391.conf
3.进入到redis安装目录启动redis服务(如之前有nodes、rdb、aof文件请先删除,非则可能会报错)。
4.进入src目录中执行如下命令搭建集群。
redis-cli --cluster create --cluster-replicas 1 IP:6379 IP:6380 IP:6381 IP:6389 IP:6390 IP:6391
5.进入其中任意一个节点,执行命令查看当前节点状态
redis-cli - h ip -p 端口 info replicationSpringBoot中使用RedisTemplate
1.pom文件中加入依赖。
org.springframework.boot spring-boot-starter-data-redis
2.创建redis配置类.
package com.wzy.demo.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Autowired
private RedisTemplate redisTemplate;
@Bean
public RedisTemplate redisTemplateInit() {
//设置序列化Key的实例化对象
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置序列化Value的实例化对象
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
3.创建RedisUtil工具类
package com.wzy.demo.util;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
@Component
public class RedisUtil {
@Resource
private RedisTemplate redisTemplate;
public void setRedisTemplate(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
//=============================common============================
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
public boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@SuppressWarnings("unchecked")
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
//============================String=============================
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public boolean set(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public long incr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, delta);
}
public long decr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递减因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, -delta);
}
//================================Map=================================
public Object hget(String key, String item) {
return redisTemplate.opsForHash().get(key, item);
}
public Map
4.在controller中测试redis。
@RequestMapping("/testRedis")
public String testRedis(Model model) throws Exception{
redisUtil.set("myid","123456");
Object object = redisUtil.get("myid");
model.addAttribute("redisKey",String.valueOf(object));
return "redis.html";
}
5.页面中显示redis的返回结果。



