问题产生起因
redis
应用过程当中个别会由客户端进行连贯资源管理,例如调配连贯、监控连贯状态、回收连接池资源- 默认设置下,
redis
不会被动断开连接 redis
的timeout
参数配置项,默认单位是秒,当timeout
是0的时候,redis
不会被动敞开连贯- 因为
redis
默认的最大连接数是10000,然而始终不敞开连贯的话随着时间推移,连贯越积越多,最终导致没有连贯可用
最终导致redis
客户端连贯的时候报错,显示"ERR max number of clients reached"
获取以后redis
配置
$ redis-cli127.0.0.1:6379> CONFIG get * # 获取timeout能够执行127.0.0.1:6379> CONFIG get timeout1) "timeout"2) "0"
解决方案
配置timout
参数值
compose.yaml
配置如下
redis: image: redis command: redis-server --requirepass testpasswd --timeout 10 container_name: demo-redis restart: always oom_kill_disable: true mem_limit: 2g ports: - 127.0.0.1:6379:6379 healthcheck: test: 'redis-cli ping || exit 1'
启动命令
redis-server --requirepass testpasswd --timeout 10
--requirepass testpasswd
: 配置redis
启动命令,设置启用明码连贯,明码设置为testpasswd
--timeout 10
: 配置当连贯无操作10s
之后连贯会断开
其余参数解释
oom_kill_disable: true
- 禁止当内存占用太多时候敞开容器
mem_limit: 2g
- 限度最大应用
2G
内存
healthcheck
- 应用健康检查容器是否服务失常
ports
- 端口凋谢配置
127.0.0.1:6379:6379
示意不对外部机器凋谢6379端口
验证
$ docker exec -it demo-redis /bin/sh# redis-cli127.0.0.1:6379> auth testpasswd127.0.0.1:6379> config get timeout1) "timeout"2) "10"# 此处期待10秒之后再次输出命令,发现Broken pipe,这个是失常的,因为以后连贯10s内没有操作,所以redis服务器敞开了该连贯127.0.0.1:6379> CONFIG get timeoutError: Broken pipenot connected>
查看clients连贯
127.0.0.1:6379> INFO clients# Clientsconnected_clients:168cluster_connections:0maxclients:10000client_recent_max_input_buffer:20567client_recent_max_output_buffer:0blocked_clients:1tracking_clients:0clients_in_timeout_table:1
浏览参考
redis文件配置详解
redis官网文档