问题产生起因

  • redis应用过程当中个别会由客户端进行连贯资源管理,例如调配连贯、监控连贯状态、回收连接池资源
  • 默认设置下,redis不会被动断开连接
  • redistimeout参数配置项,默认单位是秒,当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官网文档