Redis为什么选择单线程?Redis为什么这么快?
今天搞一下经典面试题Redis为什么选择单线程?Redis为什么这么快?,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。
一、Redis版本迭代
Redis2.6,支持lua脚本;
Redis3.0,支持集群;
Redis4.0,混合持久化,多线程异步删除;
Redis5.0,核心代码重构;
Redis6.0,多线程IO;
Redis7.0,Function、Multi-part-AOF;
二、Redis4.0之前为什么一直采用单线程?
1、Redis采用单线程模型方便开发和维护;
2、单线程模型也可以通过IO多路复用和非阻塞IO并发处理多客户端请求;
3、对于Redis来说,主要的性能瓶颈是内存和网络,而不是CPU;
三、Redis6.0引入多线程
Redis6.0之前,Redis从网络IO处理到实际的读写命令处理,都是单线程的,只不过在数据删除、数据持久化的时候使用的是多线程。
Redis的性能瓶颈主要是网络IO,因此,Redis6.0开始,采用多个IO线程来处理网络请求,提高网络请求处理的并行度。
四、Redis主线程和IO线程是如何完成请求的?
1、服务端和客户端建立socket连接
主线程负责建立连接,并把socket放入全局等待队列,主线程通过轮询的方法将socket连接分配给IO线程。
2、IO线程读取并解析请求
主线程一旦把socket分配给IO线程,就会进入阻塞状态,等待IO线程完成客户端请求,此时,采用多个IO线程并行处理。
3、主线程执行请求命令
IO线程解析完请求,主线程还是会以单线程的方式执行这些命令。
4、IO线程会写回socket和主线程清空全局队列
当主线程执行完请求命令后,会将结果写入缓冲区,主线程进入阻塞状态,等待IO线程将结果回写到socket中,并返回给客户端。
回写socket完毕后,主线程清空全局队列。
五、IO多路复用是什么?
IO多路复用,一种同步的IO模型,实现一个线程监视多个文件句柄,一旦某个文件句柄就绪就能够通知到对用的应用程序进行对应的读写操作,没有文件句柄就绪时,程序就会进入阻塞状态,释放CPU资源。
1、IO,操作系统层面指数据在内核态和用户态之间进行的读写操作;
2、多路,多个客户端socket连接;
3、复用,复用线程;
4、IO多路复用,使用单线程就能够同时处理多个客户端socket连接;
客户端socket对应的文件描述符FileDescriptor注册进epoll,epoll会监听哪些socket有消息,避免大量的无用操作。
此时socket采用非阻塞模式,整个过程只在调用select、poll、epoll时才会阻塞,收到客户端消息不会阻塞,这个进程就会被充分利用起来,这种模式一般被称为事件驱动,也就是reactor反应模式。
采用epoll的方式,最终目的是提高服务器的吞吐能力。
IO多路复用与epoll函数才是**“Redis为什么这么快?”**的直接原因。
六、总结
Redis是一个基于内存操作、KV形式的数据库,采取多路复用、非阻塞IO、避免了不必要的上下文切换等特性。
Redis一直存在BigKey问题,因此在Redis4.0引入了多线程异步删除,正式打开Redis多线程新篇章。
Redis6.0引入IO多线程的读写,更高效的处理请求,Redis只是将IO读写变成了多线程,命令的执行还是由主线程单线程执行,因此,多线程下操作Redis不会出现线程安全的问题,不用像Java那样加锁,解锁,这也是Redis为什么这么快的根本原因。
到此这篇关于Redis为什么选择单线程?Redis为什么这么快?的文章就介绍到这了,更多相关Redis线程与Redis快的原因内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?
Redis是目前广为人知的一个内存数据库,在各个场景中都有着非常丰富的应用,前段时间Redis推出了6.0的版本,在新版本中采用了多线程模型. 因为我们公司使用的内存数据库是自研的,按理说我对Redis的关注其实并不算多,但是因为Redis用的比较广泛,所以我需要了解一下这样方便我进行面试. 总不能候选人用过Redis,但是我非要问人家阿里的Tair是怎么回事吧. 所以,在Redis 6.0 推出之后,我想去了解下为什么采用多线程,现在采用的多线程和以前版本有什么区别?为什么这么晚才使用多线程?
-
redis单线程快的原因和原理
Redis之所以执行速度很快,主要依赖于以下几个原因: (一)纯内存操作,避免大量访问数据库,减少直接读取磁盘数据,redis 将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度快: (二)单线程操作,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗: (三)采用了非阻塞I/O多路复用机制 多路复用原理: 用户首先将需要进行IO操作的socket添
-
redis scan命令导致redis连接耗尽,线程上锁的解决
使用redis scan方法无法获取connection,导致线程锁死. 0.关键字 redis springboot redistemplate scan try-with-resource 1.异常现象 应用部署后,功能正常使用,但约数小时左右,部分功能接口异常,接口请求无响应. 2.异常排查 查看堆栈信息,jstask pid.首先找到java进程pid:输出堆栈信息至log文件,jstask 30 > stask.log,看到与redis相关的日志,线程状态为waiting. "p
-
关于Redis单线程的正确理解
很多同学对Redis的单线程和I/O多路复用技术并不是很了解,所以我用简单易懂的语言让大家了解下Redis单线程和I/O多路复用技术的原理,对学好和运用好Redis打下基础. 一.Redis的单线程理解 Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程.其中执行命令阶段,由于Redis是单线程来处理命令的,所有到达服务端的命令都不会立刻执行,所有的命令都会进入一个队列中,然后逐个执行,并且多个客户端发送的命令的执行顺序是不确定的,但是可以确定的是不会有两条命令被同时
-
使用redis分布式锁解决并发线程资源共享问题
前言 众所周知, 在多线程中,因为共享全局变量,会导致资源修改结果不一致,所以需要加锁来解决这个问题,保证同一时间只有一个线程对资源进行操作 但是在分布式架构中,我们的服务可能会有n个实例,但线程锁只对同一个实例有效,就需要用到分布式锁----redis setnx 原理 修改某个资源时, 在redis中设置一个key,value根据实际情况自行决定如何表示 我们既然要通过检查key是否存在(存在表示有线程在修改资源,资源上锁,其他线程不可同时操作,若key不存在,表示资源未被线程占用,允许线程
-
浅谈为什么单线程的redis那么快
目录 redis单机QPS 为什么这么快 内存型数据库 简单的数据结构 单线程 IO多路复用 总结 redis单机QPS ./redis-benchmark -t set,lpush -n 100000 -q SET: 82101.80 requests per second LPUSH: 82440.23 requests per second 在自己的电脑上测试SET和LPUSH10万次,可以发现每秒SET和LPUSH大概在8w多,接近官方说的单机10w qps的写. 为什么这么快 内存型数
-
利用redis实现分布式锁,快速解决高并发时的线程安全问题
实际工作中,经常会遇到多线程并发时的类似抢购的功能,本篇描述一个简单的redis分布式锁实现的多线程抢票功能. 直接上代码.首先按照慣例,给出一个错误的示范: 我们可以看看,当20个线程一起来抢10张票的时候,会发生什么事. package com.tiger.utils; public class TestMutilThread { // 总票量 public static int count = 10; public static void main(String[] args) { sta
-
Redis为什么选择单线程?Redis为什么这么快?
今天搞一下经典面试题Redis为什么选择单线程?Redis为什么这么快?,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦. 一.Redis版本迭代 Redis2.6,支持lua脚本: Redis3.0,支持集群: Redis4.0,混合持久化,多线程异步删除: Redis5.0,核心代码重构: Redis6.0,多线程IO: Redis7.0,Function.Multi-part-AOF: 二.Redis4.0之前为什么一直采用单线程? 1.R
-
.net core使用redis基于StackExchange.Redis
.net core使用redis基于StackExchange.Redis教程,具体如下 一.添加引用包 StackExchange.Redis Microsoft.Extensions.Configuration 二.修改配置文件 appsettings.json { "RedisConfig": { "Redis_Default": { "Connection": "127.0.0.1: 6379", "Inst
-
浅析Redis Sentinel 与 Redis Cluster
一.前言 互联网高速发展的今天,对应用系统的抗压能力要求越来越高,传统的应用层+数据库已经不能满足当前的需要.所以一大批内存式数据库和Nosql数据库应运而生,其中redis,memcache,mongodb,hbase等被广泛的使用来提高系统的吞吐性,所以如何正确使用cache是作为开发的一项基技能.本文主要介绍Redis Sentinel 及 Redis Cluster的区别及用法,Redis的基本操作可以自行去参看其官方文档 . 其他几种cache有兴趣的可自行找资料去学习. 二.Redi
-
详解java操作Redis数据库的redis工具(RedisUtil,jedis工具JedisUtil,JedisPoolUtil)
该工具包含是封装了jedis,包含redis.properties和jedisPool,序列化使用的是protostuff,map类型操作使用的是fastjson 自己抽空写的,基本只要理解什么是get,什么是set就可以使用redis数据库了 下载地址:点击打开链接 JedisPoolUtil的源码: package com.bsy.common; import java.io.FileInputStream; import java.io.FileNotFoundException; imp
-
Redis可视化工具Redis Desktop Manager的具体使用
项目中用到了redis,想查询redis中的数据,一直想找一个可视化工具,今天发现了Redis Desktop Manager,试用了一下,很好用. 1.下载 Redis Desktop Manager是开源的,可以在github下载到源码.但是想在windows上用的话需要安装包. 官网下载:https://redisdesktop.com/download github地址:https://github.com/uglide/RedisDesktopManager/releases 官网地址
-
springboot集成redis并使用redis生成全局唯一索引ID
部署redis Windows下搭建Reids本地集群,可参考https://www.jb51.net/article/242520.htm springboot集成 redis pom文件 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency&
-
Redis中ServiceStack.Redis和StackExchange.Redis区别详解
目前Redis已经更新到了6.0.2,那目前StackExchange.Redis 和 ServiceStack.Redis 两个客户端有什么区别呢? StackExchange.Redis 客户端是开源免费,而ServiceStack.Redis目前我测试了4.0以上版本就有每个小时6000的限制.性能方面,对比测试,ServiceStack比StackExchange性能上高将近50%. 以上分别是5000条和10w条数据写入读入比对,我这是将ServiceStack解除了每小时6000条数
-
Redis远程连接Redis客户端的实现步骤
目录 一 进入redis下的目录 二 启动 redis服务 三 连接客户端 四 在windows本地中安装 redis可视化软件 五 在linux关闭客户端 六 设置防火墙规则:我的因为已经设置过 七设置密码:修改redis.conf 八网络设置 九 在windows的可视化界面连接 十 在 linux中连接 十一 关闭服务端连接 在虚拟机的linux系统中 一 进入redis下的目录 二 启动 redis服务 三 连接客户端 四 在windows本地中安装 redis可视化软件 五 在linu
-
IDEA中的Redis插件连接Redis服务器
目录 一.IDEA安装Redis插件 二.IDEA连接Redis服务器 IDEA中的Redis插件作为Redis的可视化工具,可以通过该插件连接Redis服务器,并进行增删改查操作. 一.IDEA安装Redis插件 1.点击 File->Setting 2.点击Plugins 3.在Browse Repositories中输入redis 4.点击Redis插件 5.下载并重启 二.IDEA连接Redis服务器 安装完后,通过右侧工具栏或File->Setting->Other Setti
-
NoSQL和Redis简介及Redis在Windows下的安装和使用教程
NoSQL简介 介绍redis前,我想还是先认识下NoSQL,即not only sql, 是一种非关系型的数据存储,key/value键值对存储.现有Nosql DB 产品: Redis/MongoDB/Memcached/Hbase/Cassandra/ Tokyo Cabinet/Voldemort/Dynomite/Riak/ CouchDB/Hypertable/Flare/Tin/Lightcloud/ KiokuDB/Scalaris/Kai/ThruDB, 等等~~~ 为什么需要
随机推荐
- MySQL操作之JSON数据类型操作详解
- 基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
- XHTML标准语法
- 怎样快速从一个XML文件中查找信息
- javascript 自动转到命名锚记
- 详谈java线程与线程、进程与进程间通信
- JS对象深度克隆实例分析
- shell脚本实现随机生成10个8位密码
- javascript函数自动执行常用方法汇总
- js函数返回多个返回值的示例代码
- Android 5.0最应该实现的8个期望
- Android中html.fromhtml的使用方法
- winform模拟鼠标按键的具体实现
- Android 动态添加Fragment的实例代码
- php自动适应范围的分页代码
- 3550 emi 配置DHCP SERVER
- 网页吧为您提供100MB的空间
- Swift 4最全的新特性详细解析(推荐)
- C#将PDF转为多种图像文件格式的方法(Png/Bmp/Emf/Tiff)
- Django中间件拦截未登录url实例详解