一、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功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘

redis之单线程的更多相关文章

  1. 为什么redis是单线程的?速度还这么快

    为什么说Redis是单线程的? 为什么redis是单线程的?速度还这么快

  2. 为什么说Redis是单线程的以及Redis为什么这么快!(转)

    文章转自https://blog.csdn.net/chenyao1994/article/details/79491337 一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到 ...

  3. 面试之二:Redis是单线程还是多线程?以及处理模型。

      Redis是单线程还是多线程?以及处理模型. 线程:单线程 处理模型:参考书<Redis 设计与实现>P151-152 ![](https://ws1.sinaimg.cn/large ...

  4. Redis是单线程的

    Redis是单线程的 学习了: http://blog.csdn.net/liupeng_qwert/article/details/77263187 https://www.cnblogs.com/ ...

  5. 理解Redis的单线程模式

    0.概述 本文基于的Redis版本为4.0以下,在Redis更高版本中并不是完全的单线程了,增加了BIO线程,本文主要讲述主工作线程的单线程模式. 通过本文将了解到以下内容: Redis服务器采用单线 ...

  6. 《为什么说Redis是单线程的以及Redis为什么这么快!》

    为什么说Redis是单线程的以及Redis为什么这么快!   一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据”,复杂一点的会问到缓 ...

  7. redis为何单线程 效率还这么高 为何使用跳表不使用B+树做索引(阿里)

    如果想了解 redis 与Memcache的区别参考:Redis和Memcache的区别总结 阿里的面试官问问我为何redis 使用跳表做索引,却不是用B+树做索引 因为B+树的原理是 叶子节点存储数 ...

  8. redis和memcached有什么区别?redis的线程模型是什么?为什么单线程的redis比多线程的memcached效率要高得多(为什么redis是单线程的但是还可以支撑高并发)?

    1.redis和memcached有什么区别? 这个事儿吧,你可以比较出N多个区别来,但是我还是采取redis作者给出的几个比较吧 1)Redis支持服务器端的数据操作:Redis相比Memcache ...

  9. 【转帖】为什么redis 是单线程的?

    为什么redis 是单线程的? https://cloud.tencent.com/developer/article/1120615 云服务器企业新用户优先购,享双11同等价格 立即抢购 以前一直有 ...

  10. 为什么说Redis是单线程的?

    一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据” ,复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题,这些看 ...

随机推荐

  1. 04-Sed操作参数

    1 Sed操作参数 1.1 s--替换 s表示替换(substitute)文件内的字符串. [address1],[address2]s/pattern/replacement/[flag] # s/ ...

  2. C Primer Plus(4.8)編程練習

    /*C Primer Plus (4.7) 5*/ 1 include<stdio.h> 2 #define BOOK "War and Peace" 3 int ma ...

  3. 手把手教你写Dockerfile以及测试

    Dockerfile是什么? dockerfile就是用来构建docker镜像的构建文件,命令参数脚本. 如何使用Dockerfile? 1.编写一个Dockerfile文件 2.docker bui ...

  4. Python3+Selenium3自动化测试-(八)

    使用selenium进行测试,当然是需要进行验证的,此时结合python的断言函数就变得非常有用了.测试中设定好预期,当实际情况与预期有差别,给出错误信息,好像正是所希望的. 来一段简单的代码看下断言 ...

  5. 都用过@Autowired,但你知道它是怎么实现的吗

    前言 在使用Spring开发的时候,配置的方式主要有两种,一种是xml的方式,另外一种是 java config的方式.在使用的过程中java config,我们难免会与注解进行各种打交道,其中,我们 ...

  6. 如何用Python实现http客户端和服务器

    功能:客户端可以向服务器发送get,post等请求,而服务器端可以接收这些请求,并返回给客户端消息. 客户端: #coding=utf-8import http.clientfrom urllib i ...

  7. Grafana 系列文章(十三):如何用 Loki 收集查看 Kubernetes Events

    前情提要 IoT 边缘集群基于 Kubernetes Events 的告警通知实现 IoT 边缘集群基于 Kubernetes Events 的告警通知实现(二):进一步配置 概述 在分析 K8S 集 ...

  8. ASP.NET6 + Mongo + OData

    准备工作 Docker环境 Mongo数据库 配置Mongo数据库 ASP.NET6 集成Mongo 安装MongoDB.Driver { "Logging": { "L ...

  9. JAVA虚拟机18---方法调用

    1.简介 方法调用并不等同于方法中的代码被执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还未涉及方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍.最频繁的操作 ...

  10. P33_小程序的页面配置

    页面配置 页面配置文件的作用 小程序中,每个页面都有自己的 .json 配置文件,用来对当前页面的窗口外观.页面效果等进行配置. 页面配置和全局配置的关系 小程序中,app.json 中的 windo ...