【server】springboot 整合 redis

1、redis 使用模式

1.1 单机模式

1.1.1 编译安装方式

1.1.1.1 下载

Redis的安装非常简单,到Redis的官网(Downloads - Redis),下载对应的版本,简单几个命令安装即可。

1.1.1.2 编译安装
tar xzf redis-stable.tar.gz
cd redis-stable/
make & make install

安装完成后

cd /usr/local/bin/

1.1.1.3 安装常见问题

如果执行make命令报错:cc 未找到命令,原因是虚拟机系统中缺少gcc,执行下面命令安装gcc:

yum -y install gcc automake autoconf libtool make

 如果执行make命令报错:致命错误:jemalloc/jemalloc.h: 没有那个文件或目录,则需要在make指定分配器为libc。执行下面命令即可正常编译:       

make MALLOC=libc
1.1.1.4 redis单机启动

Redis编译完成后,会生成几个可执行文件,这些文件各有各的作用,我们现在先简单了解下,后面的课程会陆续说到和使用这些可执行文件。

image.png

1.1.1.4.1 默认启动

使用Redis的默认配置来启动,在bin目录下直接输入 ./redis-server         

image.png

可以看到直接使用redis-server启动Redis后,会打印出一些日志,通过日志可以看到一些信息:

当前的Redis版本的是64位的6.2.7,默认端口是6379。Redis建议要使用配置文件来启动。

因为直接启动无法自定义配置,所以这种方式是不会在生产环境中使用的。

1.1.1.4.2 带参启动

redis-server加上要修改配置名和值(可以是多对),没有设置的配置将使用默认配置,例如:如果要用6380作为端口启动Redis,那么可以执行:

./redis-server --port 6380

image.png

这种方式一般我们也用得比较少。

1.1.1.4.3 配置文件启动

配置文件是我们启动的最多的模式,配置文件安装目录中有

一般会采用将redis.conf cp 到一个新文件夹的方式,并使用./redis-server <path>/redis.conf

的形式来开启一台新的redis 服务器

     

1.1.2 docker 安装方式

1.1.2.1 下载
docker pull redis
 1.1.2.2 配置
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf
#bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
#bind 127.0.0.1
#protected-mode no #默认yes,开启保护模式,限制为本地访问
protected-mode no
#daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败
daemonize no
#appendonly yes #redis持久化(可选)
appendonly yes#主从复制,从读
replica-read-only yesrequirepass admin123# min-replicas-to-write 3
# min-replicas-max-lag 10
1.1.2.3 启动
docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \
-v /mydata/redis/conf/:/etc/redis/ \
--restart=always \
-d redis --appendonly yes

1.2 主从模式

主从模式与哨兵模式的区别为,哨兵模式需要另外启动3个哨兵

1.2.1 配置

daemonize yes
#bind 127.0.0.1
protected-mode no
port 6380
appendonly yes
dir /mydata/redis/6380/dumpfiles
pidfile /var/run/redis_6380.pid
logfile "/mydata/redis-cluster/6380/redis.log"
requirepass 111111
#从机需要配置,主机不用
masterauth "111111"
replicaof 192.168.10.131 6380
#移除高危操作键
rename-command keys ""
rename-command flushdb ""
rename-command flushall ""

1.2.2 启动服务器

#主机先启动, 再启动从机
redis-server /mydata/redis-cluster/6380/redis.conf
redis-server /mydata/redis-cluster/6381/redis.conf
redis-server /mydata/redis-cluster/6382/redis.conf

1.2.3 检查结果

# 进入客户端
redis-cli -h 127.0.0.1 -p 6380 -a 111111
redis-cli -h 127.0.0.1 -p 6381 -a 111111
redis-cli -h 127.0.0.1 -p 6382 -a 111111

1.3 哨兵模式

1.3.1 sentinel 配置

bind 0.0.0.0
#是否以后台daemon方式运行
daemonize yes
#安全保护模式
protected-mode no
# 端口
port 26379
#日志文件
logfile "/mydata/redis-cluster/26379/sentinel.log"
#pid文件路径
pidfile /var/run/redis-sentinel26379.pid
#工作目录
dir /mydata/redis-cluster/26379
# sentinel monitor <master-name> <ip> <redis-port> <quorum> 
#设置要监控的master服务器,quorum 表示最少要有几个哨兵认可下线,同意故障迁移的票数
sentinel monitor mymaster 192.168.10.131 6380 2
#连接master服务的密码
sentinel auth-pass mymaster 111111

1.3.2 启动哨兵

redis-sentinel /mydata/redis-cluster/26379/sentinel.conf  --sentinel
redis-sentinel /mydata/redis-cluster/26380/sentinel.conf  --sentinel
redis-sentinel /mydata/redis-cluster/26381/sentinel.conf  --sentinel

1.3.3 检查状态

#查看进程情况
ps -ef | grep redis
#查看单机情况
#登录客户端
redis-cli -p 6380 -a 111111
#查看详情
info replication

1.4 集群模式

1.4.1 集群模式配置

#87行
#bind 127.0.0.1
#309行
daemonize yes
#111行
protected-mode no
#138行
port 6381
#341行
pidfile /mydata/redis-cluster/6381/redis.pid
#355行
logfile "/mydata/redis-cluster/6381/cluster.log"
#510行
dir /mydata/redis-cluster/6381/dumpfiles
#1387行
appendonly yes
#539 540行
requirepass 111111
masterauth 111111
# 1584 1592 1598 行  
cluster-enabled yes
cluster-config-file /mydata/redis-cluster/6379/nodes.conf
cluster-node-timeout 5000
#移除高危操作键
rename-command keys ""
rename-command flushdb ""
rename-command flushall ""

1.4.2 启动服务器

# 各自启动主机
redis-server /mydata/redis-cluster/6580/redis.conf
...
#构建集群关系
redis-cli -a 111111 --cluster create --cluster-replicas 1 192.168.10.131:6580 192.168.10.131:6581 192.168.10.131:6582 192.168.10.131:6583 192.168.10.131:6584 192.168.10.131:6585

 

1.4.3 集群使用

#连接客户端 后面添加 -c 用来自动确认对应slot
#不加 -c 异常
# (error) MOVED 12706 192.168.10.131:6582
redis-cli -h 192.168.10.131 -p 6580 -a 111111 -c 
# 查看某个Key 所在的slot
cluster keyslot k1
#master节点下线后,slave 会切换为master ,原master 会以 slave的方式回归
#手动切换从属关系
cluster failover
# 检查集群状态
redis-cli -a 111111 --cluster check 192.168.10.131:6580

2、整合

2.1 主从模式

与哨兵模式一致

2.2 哨兵模式

2.2.1 POM.XML

<!--redis-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

2.2.2 application.yml

spring:data:redis:lettuce:pool:enabled: truemax-active: 8max-idle: 8min-idle: 0max-wait: -1mssentinel:master: mymasternodes:- 192.168.10.131:26379- 192.168.10.131:26380- 192.168.10.131:26381database: 0password: 111111

 2.2.3 添加RedisConfig类

@Configuration
public class RedisConfig {@Bean@ConditionalOnMissingBeanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);//设置key序列化方式stringredisTemplate.setKeySerializer(new StringRedisSerializer());//设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;}/*** 增加部分* 读写分离* @return*/@Beanpublic LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer() {return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA);}}

业务类查阅集群模式2.3.4 

2.3 集群模式

2.3.1 POM.XML

<!--redis-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

2.3.2 application.yml

server:port: 7777
spring:application:name: redis-demodata:redis:cluster:nodes:- 192.168.10.131:6580- 192.168.10.131:6581- 192.168.10.131:6582- 192.168.10.131:6583- 192.168.10.131:6584- 192.168.10.131:6585max-redirects: 3password: 111111database: 0lettuce:pool:max-active: 8max-wait: -1msmax-idle: 8min-idle: 0cluster:refresh:#支持集群拓扑动态感应刷新,自适应拓扑刷新是否使用所有可用的更新,默认false关闭adaptive: true#定时刷新period: 2000ms

2.3.3 添加Redis.config 类

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);//设置key序列化方式stringredisTemplate.setKeySerializer(new StringRedisSerializer());//设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;}
}

2.3.4 业务类

2.3.4.1 service
#service
public interface OrderService {/***  创建订单 key* @param key* @return*/void createOrder(String key);public String getOrder(String key);
}#serviceImpl
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {public static final String ORDER_KEY = "order:";@Resourceprivate RedisTemplate<String, Object> redisTemplate;@Overridepublic void createOrder(String key) {String orderNo = UUID.randomUUID().toString();redisTemplate.opsForValue().set(ORDER_KEY + key, orderNo);log.info("=====>编号" + key + "的订单流水生成:{}", orderNo);}@Overridepublic String getOrder(String key) {return Objects.requireNonNull(redisTemplate.opsForValue().get(ORDER_KEY + key)).toString();}
}
2.3.4.2 controller
@RestController
@RequestMapping("/lettuce")
@Slf4j
public class Demo {@Resourceprivate OrderService orderService;@GetMapping("/create")public String createOrder() {String key = UUID.randomUUID().toString();orderService.createOrder(key);return key;}@GetMapping("/get/{key}")public String getOrder(@PathVariable("key") String key) {return orderService.getOrder(key);}}

2.3.5故障

Redis Cluster集群部署采用了3主3从拓扑结构,数据读写访问master节点, slave节点负责备份。

当master宕机主从切换成功,redis手动OK,but 2个经典故障

 

 

问题的解决方案为:

添加定时刷新参数

spring:data:redis:lettuce:cluster:refresh:#支持集群拓扑动态感应刷新,自适应拓扑刷新是否使用所有可用的更新,默认false关闭adaptive: true#定时刷新period: 2000ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/868227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPU发展史(二):改变游戏规则的3Dfx Voodoo

小伙伴们&#xff0c;大家好呀&#xff0c;我是老猫。 在上一篇GPU发展史&#xff08;一&#xff09;文章中&#xff0c;我们介绍了1976-1995期间早期显卡的发展故事&#xff0c;今天我们将介绍在1995-1999年这段时间显卡的故事&#xff0c;而这段故事的主角就是——3Dfx 提起…

探索多模态预训练:MAnTiS、ActionCLIP、CPT与CoOp的Prompt技巧

上一篇博文整理了 预训练新范式&#xff08;Prompt-tuning&#xff0c;Prefix-tuning&#xff0c;P-tuning&#xff09; &#xff0c;主要是围绕NLP上的成果&#xff0c;具体的概念本文也不做过多赘述。本篇文章将主要整理几篇有代表性的Prompt方法在多模态领域中的应用。 Mult…

【ARMv8/v9 GIC 系列 1.7 -- GIC PPI | SPI | SGI | LPI 中断使能配置介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC 各种中断使能配置PPIs(每个处理器私有中断)SPIs(共享外设中断)SGIs(软件生成的中断)LPIs(局部中断)GIC 各种中断使能配置 在ARM GICv3和GICv4架构中,不同类型的中断(如PPIs、SPIs、SGIs和LPIs)可以通过不同的方式进…

RabbitMQ(集群相关部署)

RabbitMQ 集群部署 环境准备&#xff1a;阿里云centos8 服务器&#xff0c;3台服务器&#xff0c;分别进行安装&#xff1b; 下载Erlang Erlang和RabbitMQ版本对照&#xff1a;https://www.rabbitmq.com/which-erlang.html 创建yum库配置文件 vim /etc/yum.repos.d/rabbi…

生物墨水:3D组织生物打印的基石

生物墨水是3D组织生物打印技术的核心组成部分。生物墨水通常由生物材料&#xff08;如水凝胶聚合物&#xff09;与所需的细胞和/或其他生物大分子&#xff08;例如生长因子&#xff09;混合而成。为了成功地进行组织生物打印&#xff0c;生物墨水必须满足以下要求&#xff1a; …

为什么要设计DTO类

为什么要使用DTO类&#xff0c;下面以新增员工接口为例来介绍。 新增员工 1.1 需求分析和设计 1.1.1 产品原型 一般在做需求分析时&#xff0c;往往都是对照着产品原型进行分析&#xff0c;因为产品原型比较直观&#xff0c;便于我们理解业务。 后台系统中可以管理员工信息…

Bug记录:【com.fasterxml.jackson.databind.exc.InvalidDefinitionException】

bug记录 序列化错误 异常com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 完整错误(主要是FAIL_ON_EMPTY_BEANS) 00:15:20.250 [http-nio-3000-exec-1] ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - S…

数据驱动的内容优化:Kompas.ai如何提升内容表现

在数字化营销时代&#xff0c;内容是企业与用户沟通的重要桥梁。然而&#xff0c;随着信息量的爆炸性增长&#xff0c;如何让内容在激烈的竞争中脱颖而出&#xff0c;成为每个营销人员面临的问题。数据驱动的内容优化策略&#xff0c;通过精准分析和科学决策&#xff0c;帮助品…

线程安全(一)Java锁(锁分类、锁升级、锁优化)

目录 一、乐观锁二、悲观锁三、自旋锁3.1 自旋锁的优缺点:3.2 自旋锁的时间阈值:3.3 自旋锁的开启:四、Synchronized 同步锁4.1 Synchronized 作用范围:4.2 Synchronized 核心组件:4.3 Synchronized 实现:4.4 Synchronize 补充:五、ReentractLock 锁5.1 Lock 接口的主要…

业务发展中 10 个最佳的 OKR 示例

业务发展是推动组织增长、培养合作伙伴关系和扩大市场覆盖范围的重要职能。目标和关键结果 (OKR) 可以作为推动业务发展工作和实现战略目标的强大工具。在这里&#xff0c;我们展示了业务发展中的十个最佳 OKR 示例&#xff0c;为旨在在该领域脱颖而出并实现其增长目标的组织提…

产品体验周刊第2期(2024-7-8)

产品体验 阿里系产品的营销活动 无论是支付宝&#xff0c;饿了么&#xff0c;咸鱼等&#xff0c;产品的营销活动频次过高&#xff0c;且几乎任何一个活动页都让人无法理解想要表达什么&#xff0c;只有满屏的红包、优惠等字眼&#xff0c;开始对这类活动脱敏也是基于这些产品…

【漏洞复现】方正全媒体采编系统——SQL注入

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 方正全媒体采编系统&#xff08;FZMediaEditor&#xff09;是一…

在pycharm中使用jupyter

在pycharm中使用jupyter 前置条件&#xff1a;你的环境中应该有juptyer &#xff0c;没有的话 pip install jupyter 点击项目目录&#xff0c;右键->new->jupyter notebook 打开file settings 找到 jupyter server &#xff08;按照默认的用代理服务器就行&#xff09; P…

大连外贸建站公司wordpress主题模板

Robonaut萝卜纳特WP外贸站模板 适合用于工业机器人公司出口做外贸搭建公司官方网站使用的WordPress模板。 https://www.jianzhanpress.com/?p7091 优衣裳WordPress外贸建站模板 简洁的wordpress外贸独立站模板&#xff0c;适合服装、衣服、制衣外贸公司搭建公司官方网站使用…

python- Flask模块 demo

文章目录 前言python- Flask模块 demo1. 主要特点2. demo 准备工作3. demo 实例4. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c…

前端JS特效第21集:HTML5响应式多种切换效果轮播大图切换js特效代码

HTML5响应式多种切换效果轮播大图切换js特效代码&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-t…

分别通过LS和RML进行模型参数辨识matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 最小二乘法(LS)参数辨识 4.2 递归最大似然估计(RML)参数辨识 5.完整程序 1.程序功能描述 分别通过LS和RML进行模型参数辨识matlab仿真&#xff0c;仿真输出参数辨识的误差&#xff0c…

InvalidVersionSpecError: Invalid version spec: =2.7解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

微软Edge浏览器全解析:从速度到安全性的全面体验

微软Edge浏览器&#xff0c;自2015年首次亮相以来&#xff0c;已经成为了浏览器市场上不可忽视的一股力量。它不仅集成了Windows 10的许多原生功能&#xff0c;还在速度和安全性上进行了大量的优化。本文将全面解析微软Edge浏览器的各项特性&#xff0c;带您领略这款浏览器的魅…

idea 默认路径修改

1.查看 idea 的安装路径&#xff08;右键点击 idea 图标&#xff0c;查看路径 &#xff09; “C:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1\bin\idea64.exe” 在 bin 目录查看 idea.properties 文件&#xff0c;修改以下四个路径文件 # idea.config.path${user.home}/…