Docker Redis远程主机强迫关闭了一个现有的连接

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Docker Redis远程主机强迫关闭了一个现有的连接

使用Docker安装的redis,springboot连接redis,经常过一段时间就从redis取值失败,报这个错误Redis exception; nested exception is io.lettuce.core.RedisException: java.io.IOException: 远程主机强迫关闭了一个现有的连接。


1. 报错原因

spring中配置的超时时间应该大于tcp的存活时间,否则tcp连接还存活着,spring以为已经超时,又去创建,就会强制之前的连接关闭。


2.解决方案

修改redis.conf文件中的tcp-keepalive数值。就是一次连接tcp的存活时间


但是通过reids安装的有时候配置文件可能会不生效,所以使用docker重装redis,确保配置文件可以生效


修改springboot 连接redis的超时时间,需要这个时间大于tcp-keepalive的时间


3.重装Redis确保配置文件生效

拉取最新镜像

docker pull redis

创建文件夹

cd /home
mkdir redis/conf
mkdir redis/data

写入redis配置文件。redis.conf

1. cd /home/redis/conf
2. vim redis.conf

配置文件内容

##节点端口
port 6379       
##允许任何来源
#bind 0.0.0.0          
bind 47.99.149.92 120.244.10.31
## 是为了禁止公网访问redis cache,加强redis安全的。它启用的条件,有两个:1) 没有bind IP 2) 没有设置访问密码 启用后只能够通过lookback ip(127.0.0.1)访问Redis cache,如果从外网访问,则会返回相应的错误信息 
protected-mode no
##开启持久化模式
appendonly yes
appendfilename appendonly.aof
#开启混合持久化
aof-use-rdb-preamble yes
# 文件达到1m时进行重写,然后如果文件大小增长了一倍,也会触发重写。
auto-aof-rewrite-min-size 1mb
auto-aof-rewrite-percentage 100
##AOF 文件和 Redis 命令是同步频率的,假设配置为 always,其含义为当 Redis 执行命令的时候,则同时同步到 AOF 文件,这样会使得 Redis 同步刷新 AOF 文件,造成缓慢。而采用 evarysec 则代表
## 每秒同步一次命令到 AOF 文件。
appendfsync everysec            
#pidfile redis.pid
#进程pid文件,加port以示区分
pidfile /data/redis/data/redis_6379.pid
# 后台运行 ---- docker中使用后台运行将无法启动容器(应该是容器无法检测后台运行进程)
# daemonize yes
databases 20
tcp-keepalive 20
#redis初始密码
requirepass 1234

启动容器

1. 
2. docker run -d -p 6379:6379 --name my_redis  --privileged=true -v /home/redis/conf/red

通过这种方式可以指定redis的配置文件,确保配置文件中的tcp-keepalive生效

4. 配置springboot连接redis

##redis配置
spring.redis.database=0
### 服务器地址,默认为localhost
spring.redis.host=172.1.1.1
### 链接端口,默认为6379
spring.redis.port=6379
### redis密码默认为空
spring.redis.password=123456
#处理连接超时等 如 java.io.IOException: 远程主机强迫关闭了一个现有的连接。
#Spring Boot 从 2.0版本开始,将默认的Redis客户端Jedis替换为Lettuce
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0
spring.redis.timeout=30000ms
# 关闭超时时间
spring.redis.lettuce.shutdown-timeout=100


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
16天前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
25天前
|
消息中间件 存储 NoSQL
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
94 30
|
2月前
|
NoSQL 应用服务中间件 API
Redis是如何建立连接和处理命令的
本文主要讲述 Redis 是如何监听客户端发出的set、get等命令的。
903 28
|
2月前
|
NoSQL 关系型数据库 Redis
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
137 14
|
1月前
|
关系型数据库 MySQL 应用服务中间件
《docker基础篇:8.Docker常规安装简介》包括:docker常规安装总体步骤、安装tomcat、安装mysql、安装redis
《docker基础篇:8.Docker常规安装简介》包括:docker常规安装总体步骤、安装tomcat、安装mysql、安装redis
135 7
|
2月前
|
NoSQL 算法 Redis
docker高级篇(大厂进阶):安装redis集群
docker高级篇(大厂进阶):安装redis集群
186 24
|
3月前
|
监控 NoSQL 网络协议
【Azure Redis】部署在AKS中的应用,连接Redis高频率出现timeout问题
查看Redis状态,没有任何异常,服务没有更新,Service Load, CPU, Memory, Connect等指标均正常。在排除Redis端问题后,转向了AKS中。 开始调查AKS的网络状态。最终发现每次Redis客户端出现超时问题时,几乎都对应了AKS NAT Gateway的更新事件,而Redis服务端没有任何异常。因此,超时问题很可能是由于NAT Gateway更新事件导致TCP连接被重置。
|
4月前
|
NoSQL 网络协议 算法
Redis 客户端连接
10月更文挑战第21天
67 1
|
关系型数据库 数据库 Docker
Docker基础:连接容器
本文讲的是Docker基础:连接容器【编者的话】本文是作者学习Docker的笔记,介绍了Docker上的网络,并提供了例子。
2163 0
|
1月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
253 93