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 ![](https://ws1.sinaimg.cn/large ...
- Redis是单线程的
Redis是单线程的 学习了: http://blog.csdn.net/liupeng_qwert/article/details/77263187 https://www.cnblogs.com/ ...
- 理解Redis的单线程模式
0.概述 本文基于的Redis版本为4.0以下,在Redis更高版本中并不是完全的单线程了,增加了BIO线程,本文主要讲述主工作线程的单线程模式. 通过本文将了解到以下内容: Redis服务器采用单线 ...
- 《为什么说Redis是单线程的以及Redis为什么这么快!》
为什么说Redis是单线程的以及Redis为什么这么快! 一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据”,复杂一点的会问到缓 ...
- redis为何单线程 效率还这么高 为何使用跳表不使用B+树做索引(阿里)
如果想了解 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相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据” ,复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题,这些看 ...
随机推荐
- Markdown最基础语法内容
基础常用语法(大多符号后都要跟一个空格) 一.标题 1.使用 # 号可表示 1-6 级标题,一级标题对应一个 # 号,二级标题对应两个 # 号,以此类推. #不要漏了符号和内容之间的空格 一级标题 # ...
- linux环境编程(1): 实现一个单元测试框架
写在前面 在开发的过程中,大多数人都需要对代码进行测试.目前对于c/c++项目,可以采用google的gtest框架,除此之外在github上搜索之后可以发现很多其他类似功能的项目.但把别人的轮子直接 ...
- 创建型模式 - 简单工厂模式StaticFactoryMethod
简单工厂模式的定义 创建型模式: 我们把被创建的对象称为产品,把创建产品的对象称为工厂.如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫简单工厂模式. 在简单 ...
- Markdown箭头总汇
Markdown箭头的汇总 普通箭头 \[\uparrow \] $$\uparrow$$ \[\Uparrow \] $$\Uparrow$$ \[\downarrow \] $$\downarro ...
- 【HMS Core】一张图片带你玩转机器学习服务
1.介绍 总览 Cloud DB(云数据库)是一款端云协同的数据库产品,提供端云数据的协同管理.统一的数据模型和丰富的数据管理API接口等能力.在保证数据的可用性.可靠性.一致性,以及安全等特性基础 ...
- React Hooks的理解,React Hooks有哪些,解决了什么问题
一.是什么 Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 至于为什么引入hook,官方给出的动机是解决长时间使 ...
- ONES 对话 Eolink :数字化企业连接世界的第一接口
Eolink Eolink 的创业方向是一次无心插柳. 在 Eolink 创办之前,创始人刘昊臻先后参与了技术外包.在线医疗.O2O 电商等创业项目,但是觉得不太符合自己的期望. 2015 年底,刘昊 ...
- gitbook使用指南
一. node 下载 不要去node官网下载,那是最新版的,官方没提供旧版node.如果下载了最新版的还得下载一个管理node版本的工具,很麻烦且没必要. 在这个网站下载node:https://no ...
- 跳板攻击之:EarthWorm代理转发
跳板攻击之:EarthWorm代理转发 目录 跳板攻击之:EarthWorm代理转发 1 EarthWorm官方介绍 2 官方使用方法: 2.1 环境 2.2 正向 SOCKS v5 服务器 2.3 ...
- 代码随想录算法训练营day09 | leetcode 28. 实现 strStr()
LeetCode 28. 实现 strStr() 牢记一点:next[i] 元素表示[0,i]子串的最长相等前后缀个数,也是模式串与主串匹配不相等时模式串的下一个比较索引 分析1.0 前缀是指不包含最 ...