一、Redis集群搭建
1.下载redis
2.创建集群的端口分别为6380,6381,6382,将下载好的redis内容复制到创建的文件夹下
以6380文件夹为例:
在每个文件内创建一个启动脚本start.bat
# 6380为创建的端口
title redis-6380
redis-server.exe redis.windows.conf
3.修改里面的配置文件 redis.windows.conf
port 6380 //修改为与当前文件夹名字一样的端口号
appendonly yes //指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。 yes表示:存储方式,aof,将写操作记录保存到日志中
cluster-enabled yes //开启集群模式
cluster-config-file nodes-6380.conf //保存节点配置,自动创建,自动更新(建议命名时加上端口号)
cluster-node-timeout 15000 //集群超时时间,节点超过这个时间没反应就断定是宕机
(注意:redis默认没有密码,如果先修改配置设置密码的话,会报错[ERR] Sorry, can't connect to node 127.0.0.1:6380-----就需要把密码先注释掉,集群成功后在设置密码)
配置文件中的 requirepass 密码内容
4.下载Ruby并安装:(请问度娘)
cmd进入安装目录进行配置
5.构建集群脚本redis-trib.rb
需要到redis-trib.rb 下载_new Girl的博客-CSDN博客_redis-trib.rb下载,放入到redis的目录下
然后依次启动所有集群节点start.bat
然后cmd进入redis集群节点目录后,执行: (–replicas 0表示为集群中的没有节点 1则是每个主节点创建一个从节点)
redis-trib.rb create --replicas 0 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382
成功案例:
当出现提示时,需要手动输入yes,输入后,当出现以下内容,说明已经创建了Redis集群
如果出现[ERR] Sorry, can't connect to node 127.0.0.1:6380 上面提到的,需要检查下面两项
1、检查配置文件中的bind配置项配置的是ip地址还是127.0.0.1,要与此项保持一致。
2、若检查了配置文件中的其他部分,都没有出错,还要将密码注释掉,才可以。
# requirepass password
6.检验是否真的创建成功,输入以下命令:
redis-trib.rb check 127.0.0.1:6380
出现以下信息,说明创建的Redis集群是没问题的
成功后就可以设置密码
参考;:redis如何设置密码_橙子君的博客-CSDN博客_redis设置密码
成功后就可以使用可视化工具查看信息
二、项目上的Jedis访问集群
1.配置文件
spring.session.store-type=redis
server.servlet.session.timeout=3600
#session更新策略,有ON_SAVE、IMMEDIATE,前者是在调用#SessionRepository#save(org.springframework.session.Session)时,在response commit前刷新缓存,#后者是只要有任何更新就会刷新缓存
spring.session.redis.flush-mode=ON_SAVE
# redis连接池配置
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=100
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=10000
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=100
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=1
# redis-集群配置
spring.redis.cluster.nodes=127.0.0.1:6380,127.0.0.1:6381,127.0.0.1:6382
spring.redis.maxAttempts=6
spring.redis.connectionTimeout=10000
spring.redis.soTimeOut=10000
spring.redis.password=admin123
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
import java.util.HashSet;
import java.util.Set;
@Configuration
public class RedisConfig {
@Value("${spring.redis.cluster.nodes:}")
private String clusterNodes;
@Value("${spring.redis.sentinel.nodes:}")
private String sentinelNodes;
@Value("${spring.redis.maxAttempts:}")
private Integer maxAttempts;
@Value("${spring.redis.connectionTimeout:}")
private Integer connectionTimeout;
@Value("${spring.redis.soTimeOut:}")
private Integer soTimeOut;
@Value("${spring.redis.password:}")
private String password;
private static final Logger logger = LoggerFactory.getLogger(RedisConfig.class);
@Bean
public JedisCluster jedisCluster() {
String nodesStr = StringUtils.isNotEmpty(clusterNodes);
// 截取集群节点
String[] cluster = nodesStr.split(",");
// 创建set集合
Set<HostAndPort> nodes = new HashSet<>();
// 循环数组把集群节点添加到set集合中
for (String node : cluster) {
String[] host = node.split(":");
//添加集群节点
nodes.add(new HostAndPort(host[0], Integer.parseInt(host[1])));
}
if (StringUtils.isEmpty(password)) {
return new JedisCluster(nodes,
connectionTimeout,
soTimeOut,
maxAttempts
, new JedisPoolConfig());
} else {
return new JedisCluster(nodes,
connectionTimeout,
soTimeOut,
maxAttempts,
password
, new JedisPoolConfig());
}
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.JedisCluster;
import java.util.*;
@Service
public class RedisService {
@Autowired
private JedisCluster jedisCluster;
public String getString(String key) {
return jedisCluster.get(key);
}
public void setString(String key,String val,int minute){
jedisCluster.set(key, val);
jedisCluster.expire(key, minute * 60);
}
public void putObject(String key, String val, int minute) {
jedisCluster.set(key, val);
jedisCluster.expire(key, minute * 60);
}
public void delete(String key) {
jedisCluster.del(key);
}
public <T> T getObject(String key, Class<T> clazz) {
return JsonUtil.jsonToObject(jedisCluster.get(key), clazz);
}
public Set<String> scan(String key){
return jedisCluster.hkeys(key);
}
public <T> Map<String, T> objectEntry(String key,Class<T> clazz) {
Map<String, T> res = new HashMap<>();
Map<String, String> stringStringMap = jedisCluster.hgetAll(key);
for (Map.Entry<String, String> entry : stringStringMap.entrySet()) {
res.put(entry.getKey(), JsonUtil.jsonToObject(entry.getValue(), clazz));
}
return res;
}
}
有意义的文章:
SpringBoot集成redis的JedisCluster和RedisTemplate 实现redis的消息队列消费者-生产者模式,订阅者发布者模式_CNZYYH的博客-CSDN博客_jediscluster redistemplate一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式。利用redis这两种场景的消息队列都能够实现。定义:生产者消费者模式 :生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有。发布者订阅者模式:发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息...https://blog.csdn.net/CNZYYH/article/details/85696674Spring Boot使用Spring Data Redis操作Redis(单机/集群) - EasonJim - 博客园说明:Spring Boot简化了Spring Data Redis的引入,只要引入spring-boot-starter-data-redis之后会自动下载相应的Spring Data Redis和https://www.cnblogs.com/EasonJim/p/7805665.htmlSpringBoot集成redis的JedisCluster和RedisTemplate 实现redis的消息队列消费者-生产者模式,订阅者发布者模式_CNZYYH的博客-CSDN博客_jediscluster redistemplate