单进程单线程的Redis如何能够高并发
redis快的原因:
1、纯内存操作
2、异步非阻塞 IO
参考文档:
(1)http://yaocoder.blog.51cto.com/2668309/888374
(2)http://www.cnblogs.com/syyong/p/6231326.html
1、基本原理
采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗)
(1)为什么不采用多进程或多线程处理?
多线程处理可能涉及到锁
多线程处理会涉及到线程切换而消耗CPU
(2)单线程处理的缺点?
无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善
2、Redis不存在线程安全问题?
Redis采用了线程封闭的方式,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁
3、什么是多路I/O复用(Epoll)
(1) 网络IO都是通过Socket实现,Server在某一个端口持续监听,客户端通过Socket(IP+Port)与服务器建立连接(ServerSocket.accept),成功建立连接之后,就可以使用Socket中封装的InputStream和OutputStream进行IO交互了。针对每个客户端,Server都会创建一个新线程专门用于处理
(2) 默认情况下,网络IO是阻塞模式,即服务器线程在数据到来之前处于【阻塞】状态,等到数据到达,会自动唤醒服务器线程,着手进行处理。阻塞模式下,一个线程只能处理一个流的IO事件
(3) 为了提升服务器线程处理效率,有以下三种思路
(1)非阻塞【忙轮询】:采用死循环方式轮询每一个流,如果有IO事件就处理,这样可以使得一个线程可以处理多个流,但是效率不高,容易导致CPU空转
(2)Select代理(无差别轮询):可以观察多个流的IO事件,如果所有流都没有IO事件,则将线程进入阻塞状态,如果有一个或多个发生了IO事件,则唤醒线程去处理。但是还是得遍历所有的流,才能找出哪些流需要处理。如果流个数为N,则时间复杂度为O(N)
(3)Epoll代理:Select代理有一个缺点,线程在被唤醒后轮询所有的Stream,还是存在无效操作。 Epoll会哪个流发生了怎样的I/O事件通知处理线程,因此对这些流的操作都是有意义的,复杂度降低到了O(1)
4、其它开源软件采用的模型
Nginx:多进程单线程模型
Memcached:单进程多线程模型
最新文章
- python3条件控制if
- 【Beta】Scrum09
- PHPCMS导航栏当前栏目选中方法
- 关于reids
- hdu3033 背包变形
- PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入
- SQL IDENTITY(int,1,1) 用法
- iOS - 移动设备防丢失App
- 使用PSD设计网页页面
- 剑指OFFER之包含min函数的栈(九度OJ1522)
- replace()、replaceFirst()和replaceAll()的区别
- 多年心愿,终于完成,热泪盈眶啊。。。Adrew NG 的 机器学习
- CoreAnimation注意事项
- 第39章 引用令牌 - Identity Server 4 中文文档(v1.0.0)
- arcgis10.0的ArcGIS Services Directory显示401,需要身份验证,访问被拒绝,rest/services需要输入用户名和密码
- 02-VC中的变量类型
- Learning-Python【14】:匿名函数与函数递归
- 蓝桥杯-四阶幻方(DFS)
- git学习一二三一
- 二维坐标系极角排序的应用(POJ1696)
热门文章
- boolean类型的按位或||和|的区别
- Java面试&;编写程序:使子线程循环10次,紧接着主线程循环100次,来回50次
- angularJS1笔记-(14)-自定义指令(scope)
- iOS 怎么自定制推送声音呢?(APP运行时和APP进入后台时)
- Beta阶段 敏捷冲刺day1
- 通过loadrunner将http返回response写入文本txt中
- PHP 常用函数总结(三)
- 微信小程序 功能函数 将对象的键添加到数组 (函数深入)
- C# 字符串多行显示、文本换行
- Redis 优势以及性能问题