一、redis为何是单线程

官方给出的答案:

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

具体原因:

1) 不需要性能消耗的锁

redis 的 List,Hash 等复杂的数据类型,可能会进行细粒度的操作,如添加或者删除元素操作可能需要加锁,导致增加性能开销

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

多线程比单线程有更高的性能,单机多线程也不一定能满足所有场景,此时需要多服务集群化,而多服务集群化中多线程可能用不上

 

3) CPU消耗

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

二、如何理解redis的单线程

redis的单线程不是指redis只会有一个线程,而是指redis处理请求(增删改查)时只会使用一个线程去执行

redis在执行其他操作的时候,可能会开启多个进程或线程,如持久化:redis执行BGSAVE指令,进行快照持久化时,就会fork出一个子进程,然后子进程去创建快照,完成持久化操作

redis单线程的基本模型: 

redis 客户端对服务端的每次调用都会经历发送命令,执行命令,返回结果三个过程

redis 是单线程来处理命令的,所有到达服务端的命令都不会立刻执行,所有的命令都会进入一个队列中,然后逐个执行,并且多个客户端发送的命令的执行顺序是不确定的,但是不会有两条命令同时执行,不会产生并发问题

三、单线程的redis为何高并发快

1) 基于内存

内存读写相比磁盘读写少了磁盘I/O

2) 单线程

redis是单线程的,单线程减少了上下文切换和竞争锁的消耗,同时保证了原子性

3) I/O多路复用

 I/O多路复用技术可以让单个线程高效的处理多个连接请求,redis使用epoll作为I/O多路复用技术的实现。redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间
 

4) 高效的数据结构和合理的数据编码

redis基于不同的数据类型在底层使用了不同的数据结构,且redis对每种数据类型在底层使用多种不同的数据结构。不同场景下使用不同的数据结构和不同的编码

String:存储数字使int类型的编码;存储小于等于39Byte的字符串使用embstr编码;大于39Byte的字符串使用aw编码
List:元素个数小于512且元素的值都小于64Byte(默认),使用ziplist编码;否则使用linkedlist编码
Hash:素个数小于512且所有值小于6464Byte使用ziplist编码;否则使用hashtable编码
Set:元素都是整数且元素个数小于512使用intset编码;否则使用hashtable编码
Zset:元素个数小于128且每个元素的值小于64Byte使用ziplist编码;否则使用skiplist编码

5)  虚拟内存机制

redis自己构建了VM机制 ,不会像一般的系统会调用系统函数处理,会浪费一定的时间去移动和请求

redis会暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据),通过VM功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘

最新文章

  1. 学习WCF入门的第一个实例
  2. 高性能缓存系统Redis安装与使用
  3. 基于Proteus仿真的Arduino学习(2)——LED点阵探究A(LED点阵基础)
  4. 《App研发录》 源码
  5. C语言基础回顾
  6. 使用的 SQL Server 版本不支持数据类型“datetime2”.
  7. 关于sizeof 跟strlen 的区别
  8. 彻底掌握this,call,apply
  9. Laptop Issue Letter (读取Excel中指定内容,然后生成新的Excel文件)
  10. Android 高级UI设计笔记08:Android开发者常用的7款Android UI组件(转载)
  11. 【Stage3D学习笔记续】山寨Starling(十二):总结和一些没提到的东西
  12. ThinkPHP3.1新特性: 多层MVC支持
  13. sql server 扩展存储过程
  14. QQ联系客服
  15. Foundation NSMutableArray遍历,选取出符合条件的所有对象
  16. vi编辑器 :x与:wq的区别
  17. 弄懂promise
  18. review-questions
  19. 第一章 CSS基础
  20. Core Java 面经

热门文章

  1. HHKB Programming Contest 2022 Winter(AtCoder Beginner Contest 282)
  2. MAC上好用的解压工具
  3. java跨域问题解决
  4. day03-模型数据
  5. 网络编程前戏和OSI七层协议
  6. 用ksweb+Android做服务器,搭建WordPress博客环境
  7. windows环境下安装es和kibana
  8. JAVA虚拟机13-字节码指令简介
  9. RocketMQ - 生产者原理
  10. layui 手机端时间不能滑动问题