一.Rdis客户端
1.输入、输出缓冲区
每个客户端都有输入缓冲区,用来临时保存命令,大小不超过1G,过多过大的内存会造成oom,info命令和client list命令可以查看客户端的缓冲区情况。
输出缓冲区可配,超出大小会关闭客户端连接,输出缓冲区分为三种,可以适当增加salve节点的输出缓冲区
2.客户端的age和idle
分别代表已连接的时间和最近一次空闲的时间。空闲时间不宜太长。
3.最大连接数和timeout
超过最大空闲时间timeout,连接自动关闭,jedis连接池可以设置最小空闲时间、空闲检测和空闲检测的周期。
4.monitor
可以用来实时监控其他客户端在执行的命令,但是如果并发量大,monitor客户端输出缓冲区会暴涨。
二.Rdis复制
redis复制的主从流程:
1.执行saveof后保存主节点信息,ip、端口
2.建立网络连接
3.从节点发起ping命令,主节点回复pong命令
4.权限验证
5.开始同步数据集,从节点发送psync命令,psync包含runid(主redis的id)和偏移量,第一次发送偏移量为-1,runId为?
6.进行全量同步,主节点电泳bgsave命令保存rdb文件发给从节点,期间新出现的写命令操作存到replication buffer里面,从服务器加载完rdb文件后,主服务将replication buffer记录的命令发给从。同步期间replication buffer满了会导致连接断开,删除缓存,从节点重新连接,重新开始全量复制
7.后续对主节点的写则是通过命令传播了
这里有个增量复制的优化,如果主从网络断开,主服务器会把新的命令发给从的同时,会写入repl_backlog_buffer缓冲区里面,主从都会存一个偏移量的指针,网络回复后通过指针去缓冲区里面找,如果找不到,全量同步。
主从复制的时间花费:主服务的存储rdb,传输rdb,从清空数据,从加载rdb,从如果开启了aof还会重写aof
主从之间有心跳机制,主服务默认10sping一次从,从服务每一秒发一次replconf ack给主服务,上报偏移量用于检测数据是否丢失。
三.Rdis阻塞原因
1.慢查询,主要可能是操作大key
2.cpu,若redis绑定了cpu,在aof、rdb重写时,只有一个cpu,重写会占90%的cpu。另外,不要把redis和cpu密集型的服务部署在一起。
3.磁盘io瓶颈
4.aof重写,rdb备份时会fork一个子进程,共享父进程的内存,但会单独拷贝一个内存页,如果内存过大,fork会很耗时,因此建议单个redis内存不要超过10G。另外如果子进程工作期间,父进程修改了大key,发生写时复制,也会导致主进程阻塞。
5.aof的刷盘机制选择了always
6.aof设置每秒刷盘一次,会检测上一次刷盘的耗时,超过两秒,会阻塞主线程直到刷盘完成。
7.设置足够的内存,防止发生内存交换的现象
8.网络原因
四.Rdis内存
1.分为对象占用内存,实际占用内存,内存碎片等等
2.可设置redis内存上限
3.redis定时、惰性删除过期值,其中定时删除的逻辑是每个数据库空间随机检查20个键->是否超过20%过期->执行超过25毫秒进入快模式
4.建议redis运行在maxmermory>used_memory环境下,否则频繁是用回收会降低性能。
5.内存优化:键不要写太长的字符串,对值可以采用压缩算法。redis还有一个内存共享的策略,共享1-9999的常数,但是在lru淘汰策略下会失效。