美文网首页redis
Redis单线程处理IO请求性能瓶颈有哪些?

Redis单线程处理IO请求性能瓶颈有哪些?

作者: stackfuture | 来源:发表于2021-12-22 09:49 被阅读0次
GongZhongHao: 堆栈future

Redis单线程处理IO请求性能瓶颈

1. 请求在server中延迟较久

1. 操作bigkey

写入一个bigkey在分配内存时需要消耗更多的时间,同样,删除bigkey释放内存同样会产生耗时;

2. 使用复杂度过高的命令

例如SORT/SUNION/ZUNIONSTORE,或者O(N)命令,但是N很大,例如lrange key 0 -1一次查询全量数据;

3. 大量key集中过期

Redis的过期机制也是在主线程中执行的,大量key集中过期会导致处理一个请求时,耗时都在删除过期key,耗时变长;

4. 淘汰策略

淘汰策略也是在主线程执行的,当内存超过Redis内存上限后,每次写入都需要淘汰一些key,也会造成耗时变长;

5. AOF刷盘开启always机制

每次写入都需要把这个操作刷到磁盘,写磁盘的速度远比写内存慢,会拖慢Redis的性能;

6. 主从全量同步生成RDB

虽然采用fork子进程生成数据快照,但fork这一瞬间也是会阻塞整个线程的,实例越大,阻塞时间越久;

针对1-6问题,一方面需要业务人员去规避,一方面Redis在4.0推出了lazy-free机制,把bigkey释放内存的耗时操作放在了异步线程中执行,降低对主线程的影响。

2. 无法利用到CPU多核

并发量非常大时,单线程读写客户端IO数据存在性能瓶颈,虽然采用IO多路复用机制,但是读写客户端数据依旧是同步IO,只能单线程依次读取客户端的数据,无法利用到CPU多核。

针对这个问题,Redis在6.0推出了多线程,可以在高并发场景下利用CPU多核多线程读写客户端数据,进一步提升server性能,当然,只是针对客户端的读写是并行的,每个命令的真正操作依旧是单线程的。

既然有瓶颈我们为什么还需要单线程呢?

  1. 为什么用单线程?

多线程会有共享资源的并发访问控制问题,为了避免这些问题,Redis 采用了单线程的模式,而且采用单线程对于 Redis 的内部实现的复杂度大大降低

  1. 为什么单线程就挺快?

1.Redis 大部分操作是在内存上完成,并且采用了高效的数据结构如哈希表和跳表。

2.Redis 采用多路复用,能保证在网络 IO 中可以并发处理大量的客户端请求,实现高吞吐率

相关文章

  • Redis单线程处理IO请求性能瓶颈

    Redis单线程处理IO请求性能瓶颈主要包括2个⽅⾯: 1、任意⼀个请求在server中⼀旦发⽣耗时,都会影响整个...

  • Redis单线程处理IO请求性能瓶颈有哪些?

    Redis单线程处理IO请求性能瓶颈 1. 请求在server中延迟较久 1. 操作bigkey 写入一个bigk...

  • Redis的事件模型(文件描述符号&polling 机制 基础)

    Redis的高性能和他的事件模型是密不可分的,最大程度上利用了单线程、非阻塞IO模型来快速的处理请求(单线程处理多...

  • redis-io-nio

    redis-io模型 单线程的程序有哪些? nginx node.js redis 单线程为什么快 全是内存运...

  • linux 下查看性能状态命令

    解决问题: 性能优化,首先分析是由于哪些瓶颈造成的性能低下, 如 cpu 瓶颈,内存瓶颈,io瓶颈, 或者程序本身...

  • 高性能内存Redis

    Redis为什么用单线程模型 所有操作在内存,100ns 瓶颈不在cpu而是network IO,...

  • Redis学习之旅~原理篇

    内容依旧来自 核心原理 线程IO模型 单线程非阻塞IO redis是单线程模型。redis的...

  • 异步 IO 的好处

    上篇文章中,分析了几种任务处理模型:单线程阻塞 IO、多线程非阻塞 IO 和单线程非阻塞 IO 的性能,并画出了简...

  • 14.客户端

    客户端 通过使用由IO多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与...

  • 要记得

    redis 1,redis是一个单线程的高性能缓存数据库,redis底层采用网络io的多路复用(事件驱动模型)来监...

网友评论

    本文标题:Redis单线程处理IO请求性能瓶颈有哪些?

    本文链接:https://www.haomeiwen.com/subject/bncqqrtx.html