首页 > 数据库 >Redis的高并发和快速原因

Redis的高并发和快速原因

时间:2022-12-27 20:57:45浏览次数:54  
标签:多路复用 epoll 单线程 Redis 并发 线程 IO 快速

 

1.Redis是基于内存的,内存的读写速度非常快;

2.Redis是单线程的,省去了很多上下文切换线程的时间;

3.Redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。

下面重点介绍单线程设计和IO多路复用核心设计快的原因

为什么Redis是单线程的#

1.官方答案

因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

2.性能指标

关于Redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。

3.详细原因

1)不需要各种锁的性能消耗

Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除

一个对象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加。

总之,在单线程的情况下,就不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。

2)单线程多进程集群方案

单线程的威力实际上非常强大,每核心效率也非常高,多线程自然是可以比单线程有更高的性能上限,但是在今天的计算环境中,即使是单机多线程的上限也往往不能满足需要了,需要进一步摸索的是多服务器集群化的方案,这些方案中多线程的技术照样是用不上的。

所以单线程、多进程的集群不失为一个时髦的解决方案。

3)CPU消耗

采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU。

但是如果CPU成为Redis瓶颈,或者不想让服务器其他CUP核闲置,那怎么办?

可以考虑多起几个Redis进程,Redis是key-value数据库,不是关系数据库,数据之间没有约束。只要客户端分清哪些key放在哪个Redis进程上就可以了。

IO多路复用技术

Redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量。

多路-指的是多个socket连接,复用-指的是复用一个线程。多路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的多路复用技术。

这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了Redis具有很高的吞吐量。

Redis高并发快总结

1. Redis是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在IO上,所以读取速度快。

2. 再说一下IO,Redis使用的是非阻塞IO,IO多路复用,使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减少了线程切换时上下文的切换和竞争。

3. Redis采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。

4. 另外,数据结构也帮了不少忙,Redis全程使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。

5. 还有一点,Redis采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。

标签:多路复用,epoll,单线程,Redis,并发,线程,IO,快速
From: https://www.cnblogs.com/codeLearn/p/17008973.html

相关文章

  • 快速幂 矩阵快速幂题解
    目录快速幂矩阵快速幂练习题题解12.28HDU1061HDU1575HDU2035HDU5015HDU6198快速幂矩阵快速幂练习题题解12.28HDU1061题意:给定T组数据,接下来T行有T个数,求N的N次......
  • 高并发下Netty4底层bug导致直接内存溢出分析
    事故记录:10点游戏开服,迅速冲破2300+单区同时在线18点15分,运营反应玩家进不了,准备吃饭的人被抓回来排查故障发现,由于直接内存被占满,一直在FullGC,并且回收不掉,所以完全不......
  • 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue使用场景总结
    适用阻塞队列的好处:多线程操作共同的队列时不需要额外的同步,另外就是队列会自动平衡负载,即那边(生产与消费两边)处理快了就会被阻塞掉,从而减少两边的处理速度差距。当许......
  • redis针对超卖现象
    可以使用锁的方式解决锁分为乐观锁和悲观锁  乐观锁的实际运用方法:版本号法通过在数据库中的一个版本号字段来表示。 乐观锁又利用了CAS的思想......
  • Redis持久化
    Redis 为了内存数据的安全考虑,会把内存中的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边。数据保存到硬盘的过程就称为“持......
  • 安装算量风管上阀件的规格为该设备所在位置的管道规格怎样快速区分?
    答:通过单类设备的识别软件将同种类型的设备一起计算了,但有可能设备所在管道的规格不一样,那么不同规格的设备是需要区分的,设备计算完成后按管线拆分设备即可。操作步骤如下:定......
  • redis知识点笔记
    Redis相关复习知识点 相关知识点简介1为什么要使用redis(说redis优点)?2使用redis有什么缺点?3单线程的redis为什么这么快?4redis的数据类型,以及每种数据类型的使......
  • JavaWeb项目实战(3)软件快速下载
    前两篇文章里提到的所有文件均可在这里下载:​​https://www.lmonkey.com/tools/java​​......
  • 快速排序
    思路:取一个对比值,然后将他从原数组中取出,跟数组中剩下的值进行对比,需要创建两个数组,一个记录比值小的,一个记录比值大的functionquickSort(arr){if(arr.length<......
  • 【Golang 快速入门】项目实战:即时通信系统
    即时通信系统-服务端项目架构图: 版本迭代:版本一:构建基础Server版本二:用户上线功能版本三:用户消息广播机制版本四:用户业务层封装版本五:在线用户查询版本六:修改用户名......