Redis:21---客户端相关配置篇

一、客户端相关配置

①客户端的限制maxclients

  • Redis提供了maxclients参数来限制最大客户端连接数,一旦连接数超过 maxclients,新的连接将被拒绝

  • maxclients默认值是10000

  • 可以通过info clients来查询当前Redis的连接数:

  • 可以通过config set maxclients对最大客户端连接数进行动态设置:

  • 但是这个参数会受到操作系统设置的限制,在后面“Redis实践篇的陷阱文章中还会介绍”

②客户端的限制timeout

  • 一般来说maxclients=10000在大部分场景下已经绝对够用,但是某些情况由于业务方使用不当(例如没有主动关闭连接)可能存在大量idle连接, 无论是从网络连接的成本还是超过maxclients的后果来说都不是什么好事, 因此Redis提供了timeout(单位为秒)参数来限制连接的最大空闲时间,一 旦客户端连接的idle时间超过了timeout,连接将会被关闭

  • timeout默认为0,也就是不会检测客户端的空闲

  • 该参数也可以动态设置。例如设置timeout为30秒:

演示案例

  • 下面继续使用Jedis进行模拟,整个代码和上面是一样的,只不过第2) 步骤休息了31秒:

String key = "hello";
// 1) 生成jedis,并执行get操作
Jedis jedis = new Jedis("127.0.0.1", 6379);
System.out.println(jedis.get(key));
// 2) 休息31秒
TimeUnit.SECONDS.sleep(31);
// 3) 执行get操作
System.out.println(jedis.get(key));
// 4) 休息5秒
TimeUnit.SECONDS.sleep(5);
// 5) 关闭jedis连接
jedis.close();
  • 执行上述代码可以发现在执行完第2)步之后,client list中已经没有了 Jedis的连接,也就是说timeout已经生效,将超过30秒空闲的连接关闭掉:

  • 同时可以看到,在Jedis代码中的第3)步抛出了异常,因为此时客户端 已经被关闭,所以抛出的异常是JedisConnectionException,并且提示 Unexpected end of stream:

  • 如果将Redis的loglevel设置成debug级别,可以看到如下日志,也就是客 户端被Redis关闭的日志:

  • Redis源码中redis.c文件中clientsCronHandleTimeout函数就是针对timeout 参数进行检验的,只不过在源码中timeout被赋值给了server.maxidletime:

int clientsCronHandleTimeout(redisClient *c) {// 当前时间time_t now = server.unixtime;// server.maxidletime就是参数timeoutif (server.maxidletime &&// 很多客户端验证,这里就不占用篇幅,最重要的验证是下面空闲时间超过了maxidletime就会// 被关闭掉客户端(now - c->lastinteraction > server.maxidletime)){redisLog(REDIS_VERBOSE,"Closing idle client");// 关闭客户端freeClient(c);}}
  • Redis的默认配置给出的timeout=0,在这种情况下客户端基本不会出现上面的异常,这是基于对客户端开发的一种保护。例如很多开发人员在使用JedisPool时不会对连接池对象做空闲检测和验证,如果设置了timeout>0,可 能就会出现上面的异常,对应用业务造成一定影响,但是如果Redis的客户 端使用不当或者客户端本身的一些问题,造成没有及时释放客户端连接,可能会造成大量的idle连接占据着很多连接资源,一旦超过maxclients;后果也是不堪设想。所在在实际开发和运维中,需要将timeout设置成大于0,例如 可以设置为300秒,同时在客户端使用上添加空闲检测和验证等等措施,例如JedisPool使用common-pool提供的三个属性:minEvictableIdleTimeMillis、 testWhileIdle、timeBetweenEvictionRunsMillis

③tcp-keepalive

  • 检测TCP连接活性的周期

  • 默认值为300

  • 如果需要设置,建议为60,那么Redis会每隔60秒对它创建的TCP连接进行活性检测,防止大量死连接占用系统资源

④tcp-backlog

  • TCP三次握手后,会将接受的连接放入队列中,tcpbacklog就是队列的大小

  • 它在Redis中的默认值是511

  • 修改方法也非常简单,只需要执行如下命令

echo 511 > /proc/sys/net/core/somaxconn
  • 通常来讲这个参数不需要调整,但是这个参数会受到操作系统的影响。例如在Linux操作系统 中,如果/proc/sys/net/core/somaxconn小于tcp-backlog,那么在Redis启动时会 看到如下日志,并建议将/proc/sys/net/core/somaxconn设置更大

二、客户端统计片段

info clients

  • 例如下面就是一次info clients的执行结果:

 

  • 说明如下:

    • connected_clients:代表当前Redis节点的客户端连接数,需要重点监控,一旦超过maxclients,新的客户端连接将被拒绝

    • client_recent_max_output_buffer:当前所有输出缓冲区中队列对象个数的最大值

    • client_recent_max_input_buffer:当前所有输入缓冲区中占用的最大容量

    • blocked_clients:正在执行阻塞命令(例如blpop、brpop、 brpoplpush)的客户端个数

info stats

  • 参数说明:

    • total_connections_received:Redis自启动以来处理的客户端连接数总数

    • rejected_connections:Redis自启动以来拒绝的客户端连接数,需要重点监控

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

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

相关文章

Redis:23---info命令总结

info命令的格式有3种:info:部分Redis系统状态统计信息info all:全部Redis系统状态统计信息,一次性打印下面所有p的内容info p:某一块的系统状态统计信息。info命令所有的p如下所示模块名模块含义 Server服务器信息Clie…

Redis:22---客户端API:client、monitor)

一、client listclient list命令能列出与Redis服务端相连的所有客户端连接信息。例如下面代码是在一个Redis实例上执行client list的结果,其中每一行代表一个客户端信息:下面将选择几个重要的属性进行说明,其余通过表格的形式进行展示①标识&…

Redis:20---常用功能之(发布与订阅)

一、发布与订阅概述Redis提供了基于“发布/订阅”模式的消息机制,此种模式下,消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道(channel)发布消息,订阅该频道的每个客户端都可以收到该消息。 下…

Redis:19---常用功能之(HyperLogLog)

一、HyperLogLog概述HyperLogLog并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,数据集可以是IP、Email、ID等HyperLogLog提供了3个命令&a…

UNIX(多线程):13---condition_variable、wait、notify_one、notify_all

条件变量std::condition_variable、wait()、notify_one() 线程A: 等待一个条件满足线程B: 专门往消息队列中放入消息(数据),达到一定条件,通知处于等待中的线程A。std::condition_variable实际上是一个类,是一个和条件相关的一个类,说白了就是等待一个条件达成。这个类是…

UNIX(多线程):27---多线程并发之原子操作与无锁编程

原子操作:顾名思义就是不可分割的操作,该操作只存在未开始和已完成两种状态,不存在中间状态; 原子类型:原子库中定义的数据类型,对这些类型的所有操作都是原子的,包括通过原子类模板std::atomic< T >实例化的数据类型,也都是支持原子操作的。 二、如何使用原子类…

UNIX(进程间通信):01---Linux进程通信方式

Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,…

UNIX(进程间通信):02---父子进程之间的数据共享分析

之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享。接下来我们就来分析分析父子进程是否存在着数据共享。 我们都知道,在linux下,内存存储的位置是全局变量,栈区,堆区,以…

UNIX(进程间通信):04---孤儿进程

上一篇文章讲过僵尸进程,这里再分享给大家另外一种状态。 孤儿进程 什么是孤儿进程?当一个子进程还在执行时,它的父进程已经退出了,那么这个子进程的退出信息也没有被父进程接收到,如果子进程的退出信息没有被别的进程接收到,那么这个子进程就会变成一个僵尸进程,所…

UNIX(进程间通信):16深入理解Socket

socket又叫套接字或者插口,它也是进程间通信的一种方式,实际上就是网络上的通信节点,应用程序只需要链接到socket就可以和网络上任何一个通信端点连接、传送数据。socket封装了通信的细节,我们可以不必关心通信协议内容而专注于应用程序开发。根据数据传送方式,socket分为…

苹果支付:如何解决沙盒环境下获取可恢复购买项为空

在传统手游开发中免不了和苹果支付打交道,而且苹果也会有各种奇奇怪怪的问题和BUG 。 曾经有一次某一个游戏出现了调单问题,现象如下(我有点懒,不想画泳道图或者时序图): 客户端拉起支付付款成功,OC底层收到支付成功回调->发送支付成功的收据到服务器验…

游戏服务器架构:如何设计开发战斗系统的技能和buff系统

战斗系统中buff和skill如何配合 在网络游戏中的战斗形式多种多样,不同游戏的战斗逻辑也有很大的差异。但是一般都会涉及技能系统和buff系统,两种之间相互关联,技能可以产生buff作用在目标上,影响目标。同时buff也会影响技能的释放效果,两者都可以算得上游戏战斗系统最重要…

一文彻底搞懂静态库和动态库,显示链接和隐式链接

定义&#xff1a;运行时库 静态库 动态库运行时库&#xff1a;Unix中一个典型的运行时库例子就是libc&#xff0c;它包含标准的C函数&#xff0c;如&#xff0c;print()&#xff0c;exit()等等&#xff0c;用户能创建他们自己的运行库&#xff08;在Windows中是DLL&#xff09;…

mysql的cpu高定位

导致数据库CPU很高的原因有很多种,一般和慢SQL也有关(因为每条SQL要么占CPU高,要么占IO高,大体是这样)。 (1)、如果服务器有多个mysql实例,需要通过top命令看看是哪个mysql实例导致的cpu高(如果不是mysql导致的cpu高,需要优化其他导致cpu的程序): (2)、定位到占用…

游戏服务器架构-设计模式之发布订阅模式

发布订阅模式场景 熟悉消息中间件的同学应该对发布/订阅模式(Publish Subscribe Pattern)并不陌生。即使你不了解消息中间件,那么在平时生活中发布/订阅模式也是非常常见的场景。 比如你打开你的微信订阅号,你订阅的作者发布的文章,会广播给每个订阅者。在这个场景里,微信公…

聊一下CPU占用高的解决方案

前言: 在软件开发和性能测试中,CPU占用率是服务器开发一个很重要的指标,到底有哪些因素会导致CPU占 用率上升呢?又有哪些手段可以降低CPU的占用率呢? 如果你看了这篇文章后仍然没有解决项目问题的思路,请在下方留言或公众号后台留言。(后续我将更新一到两篇…

闲话目前游戏服务器的开发

我是从12年开始进入页游行业&#xff0c;接触到的第一个游戏项目就是淘米网的《摩尔庄园》&#xff0c;公司那个时候也刚在美纽交所上市&#xff0c;被Benson&#xff0c;魏震和Rock腾讯三巨头的感染下&#xff0c;做着喜欢的游戏... &#xff08;后来在工作中我经常会遇到过不…

危险!!!也许你的web网站或服务正在悄无声息地被SQL注入

2010年秋季,联合国官方网站遭受SQL注入攻击。 2014年一个叫“TeamDigi7al”的黑客组织攻击了美国海军的一个名为“Smart Web Move”的web应用。此次事件直接造成美国海军数据库超过22万服役人员的个人信息被泄露。而事后,美国海军动用了超过50万美元来弥补此次的数据泄密事故…

手把手教你使用sql注入来绕过游戏后台检测

SQL注入毫无疑问是最危险的Web漏洞之一,因为我们将所有信息都存储在数据库中。其解决方案之一,有许多公司实施Web应用程序防火墙和入侵检测/预防系统来试图保护自己。但不幸的是,这些对策往往是不充分的,并且很容易被绕过。 尽管不能依赖防火墙来防止所有SQL注入,但一些防…

设计模式 ---适配器模式

在一些业务场景里,你是否遇到过如下类似的需求: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换…