redis之单线程
一、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多路复用
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之单线程的更多相关文章
- 为什么redis是单线程的?速度还这么快
为什么说Redis是单线程的? 为什么redis是单线程的?速度还这么快
- 为什么说Redis是单线程的以及Redis为什么这么快!(转)
文章转自https://blog.csdn.net/chenyao1994/article/details/79491337 一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到 ...
- 面试之二:Redis是单线程还是多线程?以及处理模型。
Redis是单线程还是多线程?以及处理模型. 线程:单线程 处理模型:参考书<Redis 设计与实现>P151-152 
如果想了解 redis 与Memcache的区别参考:Redis和Memcache的区别总结 阿里的面试官问问我为何redis 使用跳表做索引,却不是用B+树做索引 因为B+树的原理是 叶子节点存储数 ...
- redis和memcached有什么区别?redis的线程模型是什么?为什么单线程的redis比多线程的memcached效率要高得多(为什么redis是单线程的但是还可以支撑高并发)?
1.redis和memcached有什么区别? 这个事儿吧,你可以比较出N多个区别来,但是我还是采取redis作者给出的几个比较吧 1)Redis支持服务器端的数据操作:Redis相比Memcache ...
- 【转帖】为什么redis 是单线程的?
为什么redis 是单线程的? https://cloud.tencent.com/developer/article/1120615 云服务器企业新用户优先购,享双11同等价格 立即抢购 以前一直有 ...
- 为什么说Redis是单线程的?
一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据” ,复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题,这些看 ...
随机推荐
- for循環,逗號運算符,其他(+= -= *= /=)
- SpringBoot实现电子文件签字+合同系统
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
- java画海报
package demotest; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; impor ...
- ASP.NET Core - 入口文件
1. 入口文件 一个应用程序总有一个入口文件,是应用启动代码开始执行的地方,这里往往也会涉及到应用的各种配置.当我们接触到一个新框架的时候,可以从入口文件入手,了解入口文件,能够帮助我们更好地理解 ...
- 使用HtmlAgilityPack 爬取 国家统计局 区划和城乡划分代码
HtmlAgilityPack:Html解析神器,根据url地址解析html页面内容. 项目引用HtmlAgilityPack.dll文件或者通过安装 nuget 包 HtmlAgilityPack ...
- vue + element-ui + vue-clipboard2 实现文字复制粘贴功能与提示
1.在所在项目下安装插件 npm install vue-clipboard2 --save 2.在所在项目的index.js注入vue-clipboard2 import VueClipboard ...
- 2021级《JAVA语言程序设计》上机考试试题8
专业教师功能页: <%@ page language="java" contentType="text/html; charset=UTF-8" page ...
- Training Spiking Neural Networks with Local Tandem Learning
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 36th Conference on Neural Information Processing Systems (NeurIPS 202 ...
- 手机访问wamp及wampserver64设置开放权限后局域网无法连接
服务器配置:在手机上WampServer电脑端网页的效果! 1.本地虚拟主机下的 Apache 目录中的bin 目录中的 config 配置文件 http.config文件使用代码编辑器. 2.将ht ...
- Moonraker
Moonraker 目录 Moonraker 1 信息收集 1.1 端口扫描 1.2 后台目录扫描 1.3 目录分析 1.3.1 /services/ 1.3.2 /svc-inq/salesmoon ...