Redis是典型的单线程架构,全部的读写操做都是在一条主线程中完成的。当Redis用于高并发场景时,这条线程就变成了它的生命线。若是出现阻塞,哪怕是很短期,对于应用来讲都是噩梦。redis
致使阻塞问题的缘由:算法
1、发现阻塞sql
2、内在缘由安全
2.1 API或数据结构使用不合理服务器
一般Redis执行命令速度很是快,可是,若是对一个包含上万个元素的hash结构执行hgetall操做,因为数据量比较大且命令算法复杂度是O(n),这条命令执行速度必然很慢。网络
对于高并发的场景应该尽可能避免在大对象上执行算法复杂度超过O(n)的命令。数据结构
(1)如何发现慢查询架构
Redis原生提供慢查询统计功能,执行slowlog get{n}命令能够获取最近的n条慢查询命令,默认对于执行超过10毫秒的命令都会记录到一个定长队列中,线上实例建议设置为1毫秒便于及时发现毫秒级以上的命令。并发
(2)发现慢查询后如何调整分布式
(3)如何发现大对象
Redis自己提供发现大对象的工具。具体命令:
redis-cli -h {ip} -p {port} --bigkeys
内部原理采用分段进行scan操做,把历史扫描过的最大对象统计出来便于分析优化。
2.2 CPU饱和
单线程的Redis处理命令时只能使用一个CPU。而CPU饱和是指Redis把单核CPU使用率跑到接近100%。使用top命令很容易识别出对应Redis进程的CPU使用率。CPU饱和是很是危险的,将致使Redis没法处理更多的命令,严重影响吞吐量和应用方的稳定性。对于这种状况,首先判断当前Redis的并发量是否达到极限,建议使用统计命令redis-cli -h {ip} -p {port} --stat获取当前Redis使用状况
2.3 持久化阻塞
对于开启了持久化功能的Redis节点,须要排查是不是持久化致使的阻塞。
3、外在缘由
3.1 CPU竞争
3.2 内存交换
内存交换(swap)对于Redis来讲是很是致命的,Redis保证高性能的一个重要前提是全部的数据在内存中。若是操做系统把Redis使用的部份内存换出到硬盘,因为内存与硬盘读写速度差几个数量级,会致使发生交换后的Redis性能急剧降低。
预防内存交换:
3.3 网络问题
(1)链接拒绝
(2)网络延迟
网络延迟取决于客户端到Redis服务器之间的网络环境。主要包括它们之间的物理拓扑和带宽占用状况。常见的物理拓扑按网络延迟由快到慢可分为:同物理机>同机架>跨机架>同机房>同城机房>异地机房。但它们容灾性正好相反,同物理机容灾性最低而异地机房容灾性最高。
网络延迟问题常常出如今跨机房的部署结构上,对于机房之间延迟比较严重的场景须要调整拓扑结构,如把客户端和Redis部署在同机房或同城机房等。
带宽瓶颈一般出如今如下几个方面:
(3)网卡软中断
网卡软中断是指因为单个网卡队列只能使用一个CPU,高并发下网卡数据交互都集中在同一个CPU,致使没法充分利用多核CPU的状况。网卡软中断瓶颈通常出如今网络高流量吞吐的场景。
欢迎工做一到五年的Java工程师朋友们加入Java架构开发: 855835163 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用本身每一分每一秒的时间来学习提高本身,不要再用"没有时间“来掩饰本身思想上的懒惰!趁年轻,使劲拼,给将来的本身一个交代!