令仔学Redis(二)----单线程架构
2017-05-08 23:12
232 查看
Redis是一种基于键值对(key-value)的NoSQL数据库,包含多种数据结构。官网上给出的数字是读写性能可以达到10万/秒,可见速度之快。
做个简单的例子,同时开启5个redis客户端,同时执行下面的命令:
每一条命令的执行过程都是一样的,发送命令,执行命令,返回结果。
如果是在多线程的情况下,不作任何处理很可能就会造成数据最终结果出现问题。但是Redis不会,Redis的是单线程的处理方式,新的命令并不会立即被执行,而是统一的放到了队列中,一条一条的执行.
这样的处理就不会出现并发的问题。那为什么单线程的情况下还能这么快?通常的来讲,单线程的处理能力要比多线程的处理方式要差,举个例子:10000斤的货物,每一辆车的运载能力是每次1000斤,那么如果只有一辆车的话需要10次才能完成,但是如果有10辆车呢,一次就能完成。
那为什么Redis使用单线程模型就会达到每秒万级别的处理能力?归结为以下三点:
1、纯内存访问,Redis把所有的数据都放到了内存中,内存的响应时间大约在100纳秒,这也是Redis能有百万级别处理能力的重要基础。
2、还有一点就是Redis采用了epoll作为I/O多路复用技术实现。同时Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上消耗太多的时间。关于这一点会在后续的博客中深入的讲解
3、单线程减少了 线程切换和和竟态产生的消耗。
但是单线程还有一个问题:就是对于每个命令的执行时间是有要求的,如果其中的某一个命令执行过长,会造成其他命令的阻塞,这对于Redis这种高性能的服务来说是致命的,所以Redis是面向快速执行场景的数据库。
做个简单的例子,同时开启5个redis客户端,同时执行下面的命令:
incr number
每一条命令的执行过程都是一样的,发送命令,执行命令,返回结果。
如果是在多线程的情况下,不作任何处理很可能就会造成数据最终结果出现问题。但是Redis不会,Redis的是单线程的处理方式,新的命令并不会立即被执行,而是统一的放到了队列中,一条一条的执行.
这样的处理就不会出现并发的问题。那为什么单线程的情况下还能这么快?通常的来讲,单线程的处理能力要比多线程的处理方式要差,举个例子:10000斤的货物,每一辆车的运载能力是每次1000斤,那么如果只有一辆车的话需要10次才能完成,但是如果有10辆车呢,一次就能完成。
那为什么Redis使用单线程模型就会达到每秒万级别的处理能力?归结为以下三点:
1、纯内存访问,Redis把所有的数据都放到了内存中,内存的响应时间大约在100纳秒,这也是Redis能有百万级别处理能力的重要基础。
2、还有一点就是Redis采用了epoll作为I/O多路复用技术实现。同时Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上消耗太多的时间。关于这一点会在后续的博客中深入的讲解
3、单线程减少了 线程切换和和竟态产生的消耗。
但是单线程还有一个问题:就是对于每个命令的执行时间是有要求的,如果其中的某一个命令执行过长,会造成其他命令的阻塞,这对于Redis这种高性能的服务来说是致命的,所以Redis是面向快速执行场景的数据库。
相关文章推荐
- Redis 网络架构及单线程模型
- Redis网络架构及单线程模型
- redis的key的数据结构、内部编码和单线程架构
- 高可用Redis(一):通用命令,数据结构和内部编码,单线程架构
- Memcached 及 Redis 架构分析和比较
- Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa j2ee分布式架构核心技术
- 分布式架构springmvc+springboot+springcloud+redis
- 并行编程架构(指令流水、进程、线程、多核,Pipe and Filter)
- Redis高可用架构
- Memcached 及 Redis 架构分析和比较
- Memcached 及 Redis 架构分析和比较
- 程序架构之redis扩容 (增加端口)
- Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑们
- 基于Redis+MySQL+MongoDB存储架构应用
- [Link]使用HAProxy、PHP、Redis和MySQL支撑10亿请求每周架构细节
- Redis与网站架构 @joyqi
- 详解Nginx+php-5.4+Mysql-5.5+Memcached+redis的架构部署
- 【转自聊聊架构公众号】 Redis大key图形化统计及展示
- 基于redis AE异步网络架构
- Kubernetes下的Redis主从配置架构