Redis为什么使用单进程单线程方式也这么快

[转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.html

Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是可以达到100000+的qps。这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached差。

Redis快的主要原因是:

  1. 完全基于内存
  2. 数据结构简单,对数据操作也简单
  3. 使用多路 I/O 复用模型

第一、二点不细讲,主要围绕第三点采用多路 I/O 复用技术来展开。

多路 I/O 复用模型是利用select、poll、epoll可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了Redis具有很高的吞吐量。

和Memcached不同,Redis并没有直接使用Libevent,而是自己完成了一个非常轻量级的对select、epoll、evport、kqueue这些通用的接口的实现。在不同的系统调用选用适合的接口,linux下默认是epoll。因为Libevent比较重更通用代码量也就很庞大,拥有很多Redis用不上的功能,Redis为了追求“轻巧”并且去除依赖,就选择自己去封装了一套。

单进程单线程好处

  1. 代码更清晰,处理逻辑更简单
  2. 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
  3. 不存在多进程或者多线程导致的切换而消耗CPU

单进程单线程弊端

  1. 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善;

其他一些优秀的开源软件采用的模型

  • 多进程单线程模型:Nginx
  • 单进程多线程模型:Memcached

参考链接

时间: 2024-10-24 19:15:41

Redis为什么使用单进程单线程方式也这么快的相关文章

Redis 为什么使用单进程单线程方式也这么快

Redis 采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由 C 语言编写.官方提供的数据是可以达到100000+的 qps.这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差. Redis 快的主要原因有: 完全基于内存: 数据结构简单,对数据操作也简单: 使用多路 I/O 复用模型: 第一.二点不细讲,主要围绕第三点采用多路 I/O 复用技术来展开. 多路 I/O 复用模型是利用 select.poll.epoll 可以同时监察多个流的 I/O

Redis为什么使用单进程单线程方式

Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写.官方提供的数据是可以达到100000+的qps.这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached差. Redis快的主要原因是: 完全基于内存 数据结构简单,对数据操作也简单 使用多路 I/O 复用模型 第一.二点不细讲,主要围绕第三点采用多路 I/O 复用技术来展开. 多路 I/O 复用模型是利用select.poll.epoll可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当

Redis事物特点和持久化方式

Redis的事物不支持完整的ACID,Redis虽然提供事物功能,但是Redis的事物和关系数据库事务不可同日而语,Redis的事物只能保证隔离性和一致性(I和C),无法保证原子性和持久性(A和D),具体实现原理如下: 原子性 Redis事物不支持原子性,Redis不支持回滚操作,事物中间一条命令执行失败,既不会导致前面已经执行的命令回滚,也不会中断后面的命令的执行. 一致性 Redis事物能够保证事物开始之前和事物结束以后,数据库的完整性没有被破坏 隔离性 Redis不存在多个事物的问题,因为

Redis(1.16)Redis监控为什么是单线程?为什么快?

[1]Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架.epoll中的读.写.关闭.连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间. 下面重点介绍单线程设计和IO多路复用核心设计快的原因. [2]为什么Redis是单线程的 基本解释 因为Red

[转载] redis 的两种持久化方式及原理

转载自http://www.m690.com/archives/371 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能.所以Redis也可以被看成是一个数据结构服务器.Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”):也可以把每一次数据变化都写入到一个app

redis 持久化有几种方式?

面试题 redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的? 面试官心理分析 redis 如果仅仅只是将数据缓存在内存里面,如果 redis 宕机了再重启,内存里的数据就全部都弄丢了啊.你必须得用 redis 的持久化机制,将数据写入内存的同时,异步的慢慢的将数据写入磁盘文件里,进行持久化. 如果 redis 宕机重启,自动从磁盘上加载之前持久化的一些数据就可以了,也许会丢失少许数据,但是至少不会将所有数据都弄丢. 这个其实一样,针对的都是 redi

ajax的post提交方式和传统的post提交方式哪个更快?

如果同时用ajax和post提交先执行哪个呢?是ajax返回后再执行post呢还是同时执行? ajax的post提交方式和传统的post提交方式哪个更快? >> php 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/php/1010000007305642/ajax的post提交方式和传统的post提交方式哪个更快.html

单进程单线程的Redis如何能够高并发

参考文档: (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性能,不过可以通过在单机开多个Redi

Redis的三种启动方式

Part I. 直接启动 下载 官网下载 安装 tar zxvf redis-2.8.9.tar.gz cd redis-2.8.9 #直接make 编译 make #可使用root用户执行`make install`,将可执行文件拷贝到/usr/local/bin目录下.这样就可以直接敲名字运行程序了. make install 启动 #加上`&`号使redis以后台程序方式运行 ./redis-server & 检测 #检测后台进程是否存在 ps -ef |grep redis #检测