建材做哪些网站好,重庆经典论坛新闻评论,网站标题和关键词有什么区别,以什么主题做网站好Redis 7.2.0 搭建和集群配置 一.Redis 下载与单机部署1.Redis 下载2.虚拟机配置3.Redis 单机源码安装和测试4.Java 单机连接测试1.Pom 依赖2.配置文件3.启动类4.配置类5.单元测试6.测试结果 二.Redis 集群部署1.主从1.从节点配置2.Java 测试 2.哨兵1.哨兵节点配置2.复制一个哨兵… Redis 7.2.0 搭建和集群配置 一.Redis 下载与单机部署1.Redis 下载2.虚拟机配置3.Redis 单机源码安装和测试4.Java 单机连接测试1.Pom 依赖2.配置文件3.启动类4.配置类5.单元测试6.测试结果 二.Redis 集群部署1.主从1.从节点配置2.Java 测试 2.哨兵1.哨兵节点配置2.复制一个哨兵节点双哨兵3.Java 测试访问哨兵 3.集群1.集群配置文件修改2.Java 访问 Redis 集群测试 一.Redis 下载与单机部署
1.Redis 下载
Redis 官网 2.虚拟机配置
## 1.关闭防火墙
systemctl stop firewalld systemctl disable firewalld systemctl status firewalld
## 2.配置域名解析
echo 192.168.1.103 rd1 /etc/hosts
echo 192.168.1.104 rd2 /etc/hosts
echo 192.168.1.105 rd3 /etc/hosts
echo 192.168.1.106 rd4 /etc/hosts
echo 192.168.1.107 rd5 /etc/hosts
echo 192.168.1.108 rd6 /etc/hosts关闭并禁用防火墙 3.Redis 单机源码安装和测试
## 1.解压缩
tar zxvf redis-7.2.0.tar.gz
## 2.进入源码安装目录
cd /home/redis-7.2.0/src/
## 3.编译和安装
make make install PREFIX/usr/local/redis
## 4.进入Redis解压目录
cd /home/redis-7.2.0/
## 5.修改配置
vim redis.conf
## 6.启动服务
/usr/local/redis/bin/redis-server redis.conf
## 7.停止服务
kill -9 ps aux |grep redis|grep -v grep | awk {print $2}以下行号仅供参考增加配置后会有微小变动
行号原值新值含义87bind 127.0.0.1 -::1bind 0.0.0.0 -::1绑定地址111protected-mode yes#protected-mode no防火墙保护533replicaof replicaof rd1 6379配置主节点主从同步541masterauth masterauth 123456配置主节点密码主从同步535requirepass 123456密码在空行添加
哨兵配置可在配置哨兵模式时参考
行号原值新值含义92sentinel monitor sentinel monitor mymaster 192.168.1.103 6379 1哨兵初始监控的主机地址112sentinel auth-pass mymaster MySUPER–secret-0123passw0rdsentinel auth-pass mymaster 123456哨兵配置主节点密码保持所有节点密码一致避免重新选取主节点后连接失败170requirepass requirepass 456789哨兵密码
服务启动 连接测试 连接 4.Java 单机连接测试
1.Pom 依赖
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIdredis-demo/artifactIdversion1.0-SNAPSHOT/versionpropertiesmaven.compiler.source20/maven.compiler.sourcemaven.compiler.target20/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdversion3.1.2/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactIdversion3.1.2/version/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactIdversion2.11.1/version/dependency!-- 测试类 --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.13.2/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdversion3.1.2/version/dependency/dependencies
/project2.配置文件
spring:data:redis:host: 192.168.1.103port: 6379password: 1234563.启动类
package org.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** author zhuwd moon* Description* create 2023-08-22 22:28*/
SpringBootApplication
public class RedisApp {public static void main(String[] args) {SpringApplication.run(RedisApp.class,args);}
}
4.配置类
package org.example.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;/*** author zhuwd moon* Description* create 2023-08-22 22:29*/
Component
public class RedisConfig {private RedisConnectionFactory redisConnectionFactory;Autowiredpublic void setRedisConnectionFactory(RedisConnectionFactory redisConnectionFactory) {this.redisConnectionFactory redisConnectionFactory;}Bean(name redisTemplate)public RedisTemplateString, Object redisTemplate(){RedisTemplateString, Object redisTemplate new RedisTemplate();// 序列化keyredisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new StringRedisSerializer());// 序列化hashredisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new StringRedisSerializer());// 连接redis数据库redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}
}5.单元测试
import org.example.RedisApp;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;/*** author zhuwd moon* Description* create 2023-08-22 22:29*/
RunWith(SpringRunner.class)
SpringBootTest(classes RedisApp.class)
public class TestApp {AutowiredRedisTemplateString, Object redisTemplate;Testpublic void test(){redisTemplate.opsForValue().set(test,haha);}
}
6.测试结果 查看值 二.Redis 集群部署
集群信息
HostIPrd1192.168.1.103rd2192.168.1.104rd3192.168.1.105rd4192.168.1.106rd5192.168.1.107rd6192.168.1.108
## 1.将修改后的配置文件复制到安装目录
cp /home/redis-7.2.0/redis.conf /usr/local/redis/1.主从
1.从节点配置
## 1.将 Redis 包拷贝到 rd2 / rd3
scp -r /usr/local/redis rootrd2:/usr/local/redis
scp -r /usr/local/redis rootrd3:/usr/local/redis
## 2.修改 rd2 / rd3 上 redis.conf 配置增加主节点信息 replicaof rd1 6379 / masterauth 123456
vi /usr/local/redis/redis.conf
## 3.依次启动 rd1 rd2 rd3
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
## 4.客户端连接
/usr/local/redis/bin/redis-cli
## 5.认证
auth 123456Redis 安装包复制 增加主节点配置 主节点启动信息 从节点启动信息 查看主从信息 2.Java 测试
通过上面测试代码写入主节点 主从模式故障不支持自动恢复需要人为处理从节点读需要手动写读取代码
2.哨兵
1.哨兵节点配置
## 1.复制 redis 包到 rd4
scp -r /usr/local/redis rootrd4:/usr/local/redis
## 2.拷贝 sentinel 配置文件
scp -r /home/redis-7.2.0/sentinel.conf rootrd4:/usr/local/redis/
## 3.修改哨兵配置
# sentinel monitor master-redis-name master-redis-ip master-redis-port quorum
# quorum 表示当有多少个 sentinel 认为一个 master 失效时才算真正失效取值参考 sentinels/2 1
vi /usr/local/redis/sentinel.conf
## 将 92 行修改为 sentinel monitor mymaster 192.168.1.103 6379 1
## 在 112 行增加 sentinel auth-pass mymaster 123456
## 在 170 行增加 requirepass 123456
## 4.启动哨兵
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf
## 5.查看信息
/usr/local/redis/bin/redis-cli -p 26379
127.0.0.1:26379 info修改配置 哨兵启动信息注意端口为 26379 查看哨兵信息 2.复制一个哨兵节点双哨兵
## 1.停止所有节点
kill -9 ps aux |grep redis|grep -v grep | awk {print $2}
## 2.创建日志目录
mkdir -p logfile /var/log/redis
## 3.修改配置文件 增加日志输出 大概 355 行
vi /usr/local/redis/redis.conf
vi /usr/local/redis/sentinel.conf
## 增加 logfile /var/log/redis/redis.log
## 增加 logfile /var/log/redis/sentinel.log
## 4.复制配置好的哨兵文件到 rd5
scp -r /usr/local/redis rootrd5:/usr/local/redis
## 5.启动 rd1 / rd2 / rd3
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
## 6.启动 rd4 / rd5 的哨兵
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf 3.Java 测试访问哨兵
配置文件
spring:data:redis:password: 123456 # 访问主从节点的密码sentinel:master: mymasternodes: 192.168.1.106:26379,192.168.1.107:26379password: 123456 # 访问哨兵的密码lettuce:pool:max-idle: 50min-idle: 10max-active: 100max-wait: 1000logging:level:root: infoio.lettuce.core: debugorg.springframework.data.redis: debug
配置类
package org.example.config;import io.lettuce.core.ReadFrom;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;import java.time.Duration;
import java.util.HashSet;/*** author zhuwd moon* Description* create 2023-08-22 22:29*/
Component
public class RedisConfig {/*** 配置 Redis 工厂* param properties* return*/Bean(name redisConnectionFactory)public RedisConnectionFactory redisConnectionFactory(RedisProperties properties) {//取配置RedisProperties.Cluster cluster properties.getCluster();RedisProperties.Sentinel sentinel properties.getSentinel();RedisProperties.Pool pool properties.getLettuce().getPool();//池化配置LettucePoolingClientConfiguration poolingClientConfiguration LettucePoolingClientConfiguration.builder().readFrom(ReadFrom.ANY_REPLICA).build();if (null ! pool){if (pool.getMaxIdle() 0){poolingClientConfiguration.getPoolConfig().setMaxIdle(pool.getMaxIdle());}if (pool.getMinIdle() 0){poolingClientConfiguration.getPoolConfig().setMinIdle(pool.getMinIdle());}if (pool.getMaxActive() 0){poolingClientConfiguration.getPoolConfig().setMaxTotal(pool.getMaxActive());}if (pool.getMaxWait().compareTo(Duration.ZERO) 0){poolingClientConfiguration.getPoolConfig().setMaxWait(pool.getMaxWait());}}//Redis 配置if (null ! cluster){//集群RedisClusterConfiguration clusterConfiguration new RedisClusterConfiguration(cluster.getNodes());if (null ! properties.getPassword()){clusterConfiguration.setPassword(properties.getPassword());}if (null ! cluster.getMaxRedirects()){clusterConfiguration.setMaxRedirects(cluster.getMaxRedirects());}return new LettuceConnectionFactory(clusterConfiguration,poolingClientConfiguration);} else if (null ! sentinel){//哨兵RedisSentinelConfiguration sentinelConfiguration new RedisSentinelConfiguration(sentinel.getMaster(),new HashSet(sentinel.getNodes()));sentinelConfiguration.setSentinelPassword(sentinel.getPassword());sentinelConfiguration.setPassword(properties.getPassword());//设置从节点读return new LettuceConnectionFactory(sentinelConfiguration,poolingClientConfiguration);} else {//单机RedisStandaloneConfiguration config new RedisStandaloneConfiguration();config.setHostName(properties.getHost());config.setPort(properties.getPort());config.setPassword(properties.getPassword());return new LettuceConnectionFactory(config);}}/*** redis 配置* param redisConnectionFactory* return*/Bean(name redisTemplate)public RedisTemplateString, Object redisTemplate(Qualifier(redisConnectionFactory) RedisConnectionFactory redisConnectionFactory){RedisTemplateString, Object redisTemplate new RedisTemplate();// 序列化keyredisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new StringRedisSerializer());// 序列化hashredisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new StringRedisSerializer());// 连接redis数据库redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}}
启动类
package org.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** author zhuwd moon* Description* create 2023-08-22 22:28*/
SpringBootApplication
public class RedisApp {public static void main(String[] args) {SpringApplication.run(RedisApp.class,args);}
}
测试类
package org.example.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** author zhuwd moon* Description* create 2023-08-23 20:13*/
RequestMapping(/redis)
RestController
public class RedisTest {AutowiredRedisTemplateString, Object redisTemplate;GetMapping(/write)public void write(String key,String val){redisTemplate.opsForValue().set(key,val);}GetMapping(/read)public void read(String key){System.out.println(redisTemplate.opsForValue().get(key));}
}
查看主节点/usr/local/redis/bin/redis-cli -p 26379 启动服务 测试写集群127.0.0.1:8080/redis/write?keytestvalhello 写节点rd3 读数据rd2 杀掉主节点并等待kill -9 ps aux |grep redis|grep -v grep | awk {print $2} 查看 rd4 哨兵主节点切为 rd2 查看 rd5 哨兵主节点 写测试127.0.0.1:8080/redis/write?keytestvalreHello 读测试127.0.0.1:8080/redis/read?keytest 恢复 rd5 服务/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf 通过 rd1 查看从节点信息 3.集群
清除之前测试写入的数据 查找持久化文件find / -type f -name dump.rdb 如果存在也删掉
1.集群配置文件修改
## 1.在 rd1 复制配置文件
cp /home/redis-7.2.0/redis.conf /usr/local/redis/redis-cluster.conf
## 2.编辑
vim /usr/local/redis/redis-cluster.conf
## 设置密码 requirepass 123456
## 关闭保护模式 protected-mode no
## 开启集群 cluster-enabled yes 约1586行
## 设置配置文件 cluster-config-file redis-cluster.conf 约1594行
## 设置超时 cluster-node-timeout 15000 约1600行
## 设置主节点密码 masterauth 123456
## 设置日志 logfile /var/log/redis/redis-cluster.log
## 3.将 redis-cluster.conf 分发到 rd2 / rd3 / rd4 / rd5 / rd6
scp /usr/local/redis/redis-cluster.conf rootrd2:/usr/local/redis/
scp /usr/local/redis/redis-cluster.conf rootrd3:/usr/local/redis/
scp /usr/local/redis/redis-cluster.conf rootrd4:/usr/local/redis/
scp /usr/local/redis/redis-cluster.conf rootrd5:/usr/local/redis/
scp /usr/local/redis/redis-cluster.conf rootrd6:/usr/local/redis/
## 4.依次启动 rd1 / rd2 /rd3 /rd4 /rd5 / rd6
/usr/local/redis/bin/redis-server /usr/local/redis/redis-cluster.conf
## 5.清空已有数据
## 5.创建集群 在任一节点执行
## -a 密码认证若没写密码无效带这个参数
## --cluster create 创建集群实例列表 IP:PORT IP:PORT IP:PORT IP:PORT IP:PORT IP:PORT
## --cluster-replicas 复制因子1即每个主节点需2个从节点
/usr/local/redis/bin/redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.1.103:6379 192.168.1.104:6379 192.168.1.105:6379 192.168.1.106:6379 192.168.1.107:6379 192.168.1.108:6379
启动所有节点服务 创建集群集群至少要三个主节点 查看集群信息和集群节点 新建三台虚拟机
HostIPrd7192.168.1.109rd8192.168.1.110rd9192.168.1.111
## 1.新建三台虚拟机并分发配置 rd7 / rd8 /rd9
scp -r /usr/local/redis root192.168.1.109:/usr/local/
scp -r /usr/local/redis root192.168.1.110:/usr/local/
scp -r /usr/local/redis root192.168.1.111:/usr/local/
## 2.创建日志目录 / 关闭防火墙并禁用
mkdir -p /var/log/redis
systemctl stop firewalld systemctl disable firewalld
## 3.启动 rd7 / rd8 /rd9
/usr/local/redis/bin/redis-server /usr/local/redis/redis-cluster.conf
## 4.将新节点添加到当前集群 在 rd1 执行
## -a 密码认证若没写密码无效带这个参数
## --cluster add-node 创建集群实例列表 IP:PORT IP:PORT IP:PORT IP:PORT IP:PORT IP:PORT
## 要有一个节点为当前集群的节点
## /usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.109:6379 192.168.1.110:6379 192.168.1.111:6379 192.168.1.103:6379查看集群命令说明/usr/local/redis/bin/redis-cli --cluster help ## 添加主节点
/usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.109:6379 192.168.1.103:6379
## 如果 slot 分配不均可以用如下命令修复集群
## 分配不均报错如下 [ERR] Not all 16384 slots are covered by nodes.
/usr/local/redis/bin/redis-cli -a 123456 --cluster fix 192.168.1.103:6379
## 执行 resharding 指令来为它分配 hash slots
## 执行下面命令后要依次设置移动 slot 的节点 ID 源节点列表可直接用 all
/usr/local/redis/bin/redis-cli -a 123456 --cluster reshard 192.168.1.103:6379添加主节点并查看结果部分截图 查看主从节点状态/usr/local/redis/bin/redis-cli -a 123456 --cluster check 192.168.1.103:6379 | grep ‘M|S’ ## 随机添加从节点优先添加到从节点少的节点下
/usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.110:6379 192.168.1.103:6379 --cluster-slave
## 添加到指定主节点下添加到 103 即 rd1 下面
/usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.111:6379 192.168.1.103:6379 --cluster-slave --cluster-master-id 9e99c815e3660680439261573c5c5b382573cf1c随机添加 查看主从节点状态/usr/local/redis/bin/redis-cli -a 123456 --cluster check 192.168.1.103:6379 2.Java 访问 Redis 集群测试
配置集群主节点
spring:data:redis:password: 123456 # 访问主从节点的密码cluster:max-redirects: 10nodes: 192.168.1.103:6379,192.168.1.105:6379,192.168.1.108:6379,192.168.1.109:6379lettuce:pool:max-idle: 50min-idle: 10max-active: 100max-wait: 1000enabled: truelogging:level:root: infoio.lettuce.core: debugorg.springframework.data.redis: debug
修改插入方法计算 SLOT
package org.example.controller;import io.lettuce.core.codec.CRC16;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** author zhuwd moon* Description* create 2023-08-23 20:13*/
RestController
RequestMapping(/redis)
public class RedisTest {AutowiredRedisTemplateString, Object redisTemplate;private static final int SLOT_S 16384;GetMapping(/write)public void write(String key,String val){int slot CRC16.crc16(key.getBytes())%SLOT_S;redisTemplate.opsForValue().set(key,val);System.out.println(slot slot key key val val);}GetMapping(/read)public void read(String key){System.out.println(redisTemplate.opsForValue().get(key));}
}
测试插入数据127.0.0.1:8080/redis/write?keytestvalreHello 查看日志插入主节点为 rd3【192.168.1.105】槽号为 6918 读数据127.0.0.1:8080/redis/read?keytest 从节点 192.168.1.104 为 rd2查看其是否为 rd3 从节点/usr/local/redis/bin/redis-cli -a 123456 --cluster check 192.168.1.103:6379 客户端查看数据 查看集群槽号 12376 属于 103 节点 rd1 插入 Key 测试其节点127.0.0.1:8080/redis/write?keyRedisTJXYval12376 查看客户端数据