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:单进程多线程模型

最新文章

  1. python3条件控制if
  2. 【Beta】Scrum09
  3. PHPCMS导航栏当前栏目选中方法
  4. 关于reids
  5. hdu3033 背包变形
  6. PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入
  7. SQL IDENTITY(int,1,1) 用法
  8. iOS - 移动设备防丢失App
  9. 使用PSD设计网页页面
  10. 剑指OFFER之包含min函数的栈(九度OJ1522)
  11. replace()、replaceFirst()和replaceAll()的区别
  12. 多年心愿,终于完成,热泪盈眶啊。。。Adrew NG 的 机器学习
  13. CoreAnimation注意事项
  14. 第39章 引用令牌 - Identity Server 4 中文文档(v1.0.0)
  15. arcgis10.0的ArcGIS Services Directory显示401,需要身份验证,访问被拒绝,rest/services需要输入用户名和密码
  16. 02-VC中的变量类型
  17. Learning-Python【14】:匿名函数与函数递归
  18. 蓝桥杯-四阶幻方(DFS)
  19. git学习一二三一
  20. 二维坐标系极角排序的应用(POJ1696)

热门文章

  1. boolean类型的按位或||和|的区别
  2. Java面试&编写程序:使子线程循环10次,紧接着主线程循环100次,来回50次
  3. angularJS1笔记-(14)-自定义指令(scope)
  4. iOS 怎么自定制推送声音呢?(APP运行时和APP进入后台时)
  5. Beta阶段 敏捷冲刺day1
  6. 通过loadrunner将http返回response写入文本txt中
  7. PHP 常用函数总结(三)
  8. 微信小程序 功能函数 将对象的键添加到数组 (函数深入)
  9. C# 字符串多行显示、文本换行
  10. Redis 优势以及性能问题