首页 文章 精选 留言 我的

精选列表

搜索[面试],共4915篇文章
优秀的个人博客,低调大师

学习Java基础知识,打通面试关~十二接口与抽象类

在我们Java开发的过程中,接口使我们经常使用到。但是我们也会用到抽象类。那么我们在开发的时,具体应该怎么选择呢?这两者有什么区别?我们今天就来学习下。 抽象类 抽象类顾名思义就是不能实例化的类,我们在创建的时候会使用abstract 来创建。在抽象类中含有无具体实现的方法,所以我们在使用的时候不能使用该类来创建对象。 抽象类在表面上普通的类没有区别,可以有多个抽象方法,当然也可以没有抽象方法。 抽象类的实现主要是为了提供代码复用的目的。 抽象类前面的修饰除了abstract ,还有有public,protected,缺省情况下是public。不能是private.不然子类不能继承父类。 我们子类在继承抽象类时,子类必须实现父类的抽象方法,否则 ,子类也必须定义为抽象类。 public abstract class Abstorct { //方法声明为抽象的。 public abstract void add(); } public class AbstorctImpl extends Abstorct { @Override public void add() { } } 接口 编程中,接口我们经常使用,利用它达到API定义与实现分离的目的。 在Java中,是没有多继承这一实现的,但是我们可以使用接口来达到这个目的。方便我们去实现我们想要的目的。 接口中的变量总是被隐式指定为public static final 变量。 并且方法也是被隐式的定义为public abstract。接口中的方法必须都是抽象方法。 在java8以后,接口中也有了默认的实现方法。 //java集合中一个默认实现的方法。 public interface Collection<E> extends Iterable<E> { default boolean removeIf(Predicate<? super E> filter) { Objects.requireNonNull(filter); boolean removed = false; final Iterator<E> each = iterator(); while (each.hasNext()) { if (filter.test(each.next())) { each.remove(); removed = true; } } return removed; } } 两者不同点 两者一个是类一个是接口,从子类来实现或者继承时,实现就不同,继承类java中只能单继承。 抽象类是事务的抽象,比如我们对于一个动物的描述,人和猴都有相似的东西,可以抽象出来共同的特征。 抽象类 是一个 has-a的关系。接口是is-a的关系。比如猴是否能跳,能跳跃,那么就能实现该接口,不能实现则不能实现。 接口中不能含有静态代码块和静态方法,但是抽象类是可以存在静态代码块和静态方法的。 接口中的成员变量默认是public static final 类型的。抽象函数中的成员可以是各个类型的。 我们在程序中如果对接口进行增加方法,那么子类实现也得增加其实现方法 不可取,但是java8以后增加了默认方法的实现。而抽象类中添加了非抽象方法,子类只会享受其能力的扩展,不用担心编译出现问题。 简单了解下抽象方法和接口,让我们在编程的时候更加享受其特性带来的方便。在选择上可以有更多的选择。 原文发布时间为:2018-07-01本文作者:mengrui本文来自云栖社区合作伙伴“LuckQI”,了解相关信息可以关注“LuckQI”。

优秀的个人博客,低调大师

关于一道面试题的极其无聊的python算法实现

题目是这样的: 某科技公司两位科学家(甲、乙)去吃饭,坐在一家酒店靠近街道的窗口座位吃饭,在等待上菜的过程中,闲极无聊,甲向乙出了一道猜三个女儿年龄的题目。 甲:我有3个女儿,3人年龄之积等于36; 乙:猜不出来; 甲:3个女儿年龄之和等于街道上的行人数; 乙:还是无法确定; 甲:我的大女儿叫苏珊。 乙:哦,我知道了。 请问,甲的3个女儿年龄各是多少? 闲着无聊,加上这道题也有点意思,就试着用python写了一下 解题思路 首先我们要明白题目中给出的线索 1、3个女儿的年龄积为36 2、她们的年龄和已知,但是不能得到最终结果 3、有一个大女儿 就这3个条件,就可以得出我们想要的结果,实话说,开始我也是很懵逼,后来仔细想了想,还是有可能的,我们可以这样来做 1、找出积为36的所有可能,并写入列表 2、上面的列表求和,结果不唯一,则为备选答案 3、列表中最大的值唯一 怎么样,这样来看是不是清晰多了 先来看看,怎么获取所有积为36的列表,我们新建一个函数,然后循环1-36之间的所有可能3次,最后判断3个数字相加为36即写入列表,这里注意,先将列表排序,然后在写入列表的时候就可以判断去重了。 然后就是在来一个函数,主要是计算一个列表的所有元素的和 最后就是主函数了,这里主要做最后的判断,先循环列表,取出所有列表的和,如果没有重复就写入一个空列表在,如果重复了,就再次进行判断,最后一个条件,最大值是否唯一,这样就可以得出我们想要的结果了! 完整代码如下: emmm,学习之余写写算法,高手勿喷~!欢迎大家关注我,并一起来学习交流哦!题目是这样的: 某科技公司两位科学家(甲、乙)去吃饭,坐在一家酒店靠近街道的窗口座位吃饭,在等待上菜的过程中,闲极无聊,甲向乙出了一道猜三个女儿年龄的题目。 甲:我有3个女儿,3人年龄之积等于36; 乙:猜不出来; 甲:3个女儿年龄之和等于街道上的行人数; 乙:还是无法确定; 甲:我的大女儿叫苏珊。 乙:哦,我知道了。 请问,甲的3个女儿年龄各是多少? 闲着无聊,加上这道题也有点意思,就试着用python写了一下 解题思路 首先我们要明白题目中给出的线索 1、3个女儿的年龄积为36 2、她们的年龄和已知,但是不能得到最终结果 3、有一个大女儿 就这3个条件,就可以得出我们想要的结果,实话说,开始我也是很懵逼,后来仔细想了想,还是有可能的,我们可以这样来做 1、找出积为36的所有可能,并写入列表 2、上面的列表求和,结果不唯一,则为备选答案 3、列表中最大的值唯一 怎么样,这样来看是不是清晰多了 先来看看,怎么获取所有积为36的列表,我们新建一个函数,然后循环1-36之间的所有可能3次,最后判断3个数字相加为36即写入列表,这里注意,先将列表排序,然后在写入列表的时候就可以判断去重了。 然后就是在来一个函数,主要是计算一个列表的所有元素的和 最后就是主函数了,这里主要做最后的判断,先循环列表,取出所有列表的和,如果没有重复就写入一个空列表在,如果重复了,就再次进行判断,最后一个条件,最大值是否唯一,这样就可以得出我们想要的结果了! 完整代码如下: emmm,学习之余写写算法,高手勿喷~!欢迎大家关注我,并一起来学习交流哦!

优秀的个人博客,低调大师

java-面试- Java并发编程(一)——并发编程需要注意的问题

并发是为了提升程序的执行速度,但并不是多线程一定比单线程高效,而且并发编程容易出错。若要实现正确且高效的并发,就要在开发过程中时刻注意以下三个问题: 上下文切换 死锁 资源限制 接下来会逐一分析这三个问题,并给出相应的解决方案。 问题一:上下文切换会带来额外的开销 线程的运行机制 一个CPU每个时刻只能执行一条线程; 操作系统给每条线程分配不同长度的时间片; 操作系统会从一堆线程中随机选取一条来执行; 每条线程用完自己的时间片后,即使任务还没完成,操作系统也会剥夺它的执行权,让另一条线程执行 什么是“上下文切换”? 当一条线程的时间片用完后,操作系统会暂停该线程,并保存该线程相应的信息,然后再随机选择一条新线程去执行,这个过程就称为“线程的上下文切换”。 上下文切换的过程 暂停正在执行的线程; 保存该线程的相关信息(如:执行到哪一行、程序计算的中间结果等) 从就绪队列中随机选一条线程; 读取该线程的上下文信息,继续执行 上下文切换是有开销的 每次进行上下文切换时都需要保存当前线程的执行状态,并加载新线程先前的状态。如果上下文切换频繁,CPU花在上下文切换上的时间占比就会上升,而真正处理任务的时间占比就会下降。因此,为了提高并发程序的执行效率,让CPU把时间花在刀刃上,我们需要减少上下文切换的次数。 如何减少上下文切换? 减少线程的数量由于一个CPU每个时刻只能执行一条线程,而傲娇的我们又想让程序并发执行,操作系统只好不断地进行上下文切换来使我们从感官上觉得程序是并发执的行。因此,我们只要减少线程的数量,就能减少上下文切换的次数。然而如果线程数量已经少于CPU核数,每个CPU执行一条线程,照理来说CPU不需要进行上下文切换了,但事实并非如此。 控制同一把锁上的线程数量如果多条线程共用同一把锁,那么当一条线程获得锁后,其他线程就会被阻塞;当该线程释放锁后,操作系统会从被阻塞的线程中选一条执行,从而又会出现上下文切换。因此,减少同一把锁上的线程数量也能减少上下文切换的次数。 采用无锁并发编程我们知道,如果减少同一把锁上线程的数量就能减少上下文切换的次数,那么如果不用锁,是否就能避免因竞争锁而产生的上下文切换呢?答案是肯定的!但你需要根据以下两种情况挑选不同的策略: 需要并发执行的任务是无状态的:HASH分段所谓无状态是指并发执行的任务没有共享变量,他们都独立执行。对于这种类型的任务可以按照ID进行HASH分段,每段用一条线程去执行。 需要并发执行的任务是有状态的:CAS算法如果任务需要修改共享变量,那么必须要控制线程的执行顺序,否则会出现安全性问题。你可以给任务加锁,保证任务的原子性与可见性,但这会引起阻塞,从而发生上下文切换;为了避免上下文切换,你可以使用CAS算法, 仅在线程内部需要更新共享变量时使用CAS算法来更新,这种方式不会阻塞线程,并保证更新过程的安全性。 问题二:并发不当可能会产生死锁 什么是“死锁”? 当多个线程相互等待已经被对方占用的资源时,就会产生死锁。 死锁示例 class DeadLock { // 锁A private Object lockA; // 锁B private Object lockB; // 第一条线程 Thread t1 = new Thread(new Runnable(){ void run () { synchronized (lockA) { Thread.sleep(5000); synchronized (lockB) { System.out.println("线程1"); } } } }).start(); // 第二条线程 Thread t2 = new Thread(new Runnable(){ void run () { synchronized (lockB) { Thread.sleep(5000); synchronized (lockA) { System.out.println("线程2"); } } } }).start(); } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 线程1和线程2都需要锁A和锁B 线程1首先获得锁A,然后sleep 5秒PS:线程sleep过程中会释放执行权 此时线程2执行,获得锁B,然后也sleep 5秒; 线程1 sleep 5秒后继续执行,此时需要锁B,然而锁B已经被线程2持有,因此线程1被阻塞; 此时线程2醒了,它需要锁A,然而锁A已经被线程1持有,因此它也被阻塞; 此时死锁出现了!两条线程相互等待已经被占用的资源,程序就死在这了。死锁是并发编程中一个重要的问题,上面介绍的减少上下文切换只是为了提升程序的性能,而一旦产生死锁,程序就不能正确执行! 如何避免死锁? 不要在一条线程中嵌套使用多个锁; 不要在一条线程中嵌套占用多个计算机资源; 给锁和资源加超时时间如果你非要在一条线程中嵌套使用多个锁或占用多个资源,那你需要给锁、资源加超时时间,从而避免无限期的等待。 问题三:计算机资源会限制并发 误区:线程越多速度越快 在并发编程中,并不是线程越多越好,有时候线程多了反而会拉低执行效率,原因如下: 线程多了会导致上下文切换增多,CPU花在上下文切换的时间增多后,花在处理任务上的时间自然就减少了。 计算机资源会限制程序的并发度。 比如:你家网入口带宽10M,你写了个多线程下载的软件,同时开100条线程下载,那每条线程平均以每秒100k的速度下载,然而100条线程之间还要不断进行上下文切换,所以你还不如只开5条线程,每条平均2M/s的速度下载。 再比如:数据库连接池最多给你用10个连接,然而你却开了100条线程进行数据库操作,那么当10个用完后其他线程就要等待,从而操作系统要在这100条线程间不断进行上下文切换;所以与其这样还不如只开10条线程,减少上下文切换的次数。 说了这么多只想告诉你一个道理:线程并不是越多越好,要根据当前计算机所能提供的资源考虑。 什么是“资源”? 资源分为硬件资源和软件资源: 硬件资源 硬盘读写速度 网络带宽 等 软件资源 Socket连接数 数据库连接数 等 如何解决资源的限制? 花钱买更高级的机器 根据资源限制并发度

优秀的个人博客,低调大师

APIJSON 5.1.0 发布,腾讯面试考察•感谢两个贡献者者

APIJSON 5.1.0:提升可扩展性;解决 bug;优化功能和代码;完善文档等 功能 请求参数校验:REFUSE 新增支持 !key 排除禁止字段,优化 MUST 和 REFUSE 处理性能;部分常量改为可自定义静态变量; 解决 PUT 不能完整替代 json, jsonb 字段的数组值,感谢 @weiwei162 的贡献 #387; 解决 Oracle 分页获取时无法获取除第一页以外的数据,感谢 @SingleDogL 的贡献 #390; 解决高并发下生成主键冲突导致新增记录失败等; 优化 SQL 执行缓存;优化角色权限、参数校验、远程函数的初始化; 优化登录报错和远程函数执行报错的提示;优化主键泛型;优化代码; 文档 更新 @combine 条件组合说明为 5.0+ 的条件任意组合格式; 更新 5.0 新增的 @having&:"...", @having:{...} 两种用法; 完善 JOIN 的类型以及 join:{...} 这种可带 ON 及功能符的写法; 完善 JOIN ON 的各种关联方式、支持多字段关联、支持其它条件的说明; 相关推荐新增 apijson在同一个接口调用中 使用远程函数写入更新时间和创建时间,感谢博主,点赞、收藏支持下博主吧~ 生态项目新增 路由插件 apijson-router,对外暴露类 RESTful 接口,内部转成 APIJSON 接口执行,点 Star 支持下作者吧~ 完整更新日志具体见Release 发布版本。 APIJSON 简介 腾讯 APIJSON 是一种专为 API 而生的 JSON 网络传输协议 以及 基于这套协议实现的 ORM 库。 为各种增删改查提供了完全自动化的万能 API,零代码实时满足千变万化的各种新增和变更需求。 能大幅降低开发和沟通成本,简化开发流程,缩短开发周期。 适合中小型前后端分离的项目,尤其是 初创项目、内部项目、低代码/零代码、小程序、BaaS、Serverless 等。 通过万能的 API,前端可以定制任何数据、任何结构。 大部分 HTTP 请求后端再也不用写接口了,更不用写文档了。 前端再也不用和后端沟通接口或文档问题了。再也不会被文档各种错误坑了。 后端再也不用为了兼容旧接口写新版接口和文档了。再也不会被前端随时随地没完没了地烦了。 为什么选择 APIJSON? 解决十大痛点(APIJSON 可大幅提振开发效率、强力杜绝联调扯皮、巧妙规避文档缺陷、非常节省流量带宽等) 开发提速很大(CRUD 零代码热更新全自动,APIJSONBoot 对比 SSM、SSH 等保守估计可提速 20 倍以上) 腾讯官方开源(使用 GitHub、Gitee、工蜂 等平台的官方账号开源,微信公众号、腾讯云+社区 等官方公告) 社区影响力大(GitHub 1W+ Star 在 400W+ Java 项目中排名前 110,远超 FLAG, BAT 等国内外绝大部分开源项目) 各项荣誉成就 (腾讯内外 5 个奖项、腾讯开源前十、腾讯后端项目 Star 第一、GitHub Java 日周月榜大满贯 等) 多样用户案例(腾讯内部用户包含 互娱、音乐、云与智慧,外部用户包含 500 强上市公司、数千亿资本国企 等) 适用场景广泛(社交聊天、阅读资讯、影音视频、办公学习 等各种 App、网站、公众号、小程序 等非金融类项目) 周边生态丰富(Android, iOS, Web 等各种 Demo、继承 JSON 的海量生态、零代码 接口测试 和 单元测试 工具等) 文档视频齐全(项目介绍、快速上手、安装部署 等后端、前端、客户端的 图文解说、视频教程、代码注释 等) 功能丰富强大(增删改查、分页排序、分组聚合、各种条件、各种 JOIN、各种子查询、跨库连表 等零代码实现) 使用安全简单(自动增删改查、自动生成文档、自动管理版本、自动控制权限、自动校验参数、自动防SQL注入等) 灵活定制业务(在后端编写 远程函数,可以拿到 session、version、当前 JSON 对象 等,然后自定义处理) 高质可靠代码(代码严谨规范,商业分析软件源伞 Pinpoint 代码扫描报告平均每行代码 Bug 率低至 0.15%) 兼容各种项目(协议不限 HTTP,与其它库无冲突,对各类 Web 框架集成友好且提供 SpringBoot, JFinal 的 Demo) 工程轻量小巧(仅依赖 fastjson,Jar 仅 280KB,Java 文件仅 59 个共 13719 行代码,例如 APIJSONORM 4.3.1) 多年持续迭代(自 2016 年开源至今已连续维护 5 年多,累计 2600+ Commits、80+ Releases,不断更新迭代中...) APIJSON 生态项目 apijson-router 【新】APIJSON 的路由插件,可控地对公网暴露类 RESTful 简单接口,内部转成 APIJSON 格式请求来执行。 hyperf-APIJSON【新】PHP 版 APIJSON,基于 Hyperf(PHP Swoole),支持 APIJSON 多种关联和多个功能符 APIJSON.NETC# 版 APIJSON,支持大部分 APIJSON 功能,支持 MySQL, PostgreSQL, SQL Server, Oracle, SQLite apijson-go【新】Go 版 APIJSON,支持单表查询、列表筛选、关联查询、多个功能符等 apijson-node字节跳动工程师开发的 Node.ts 版 APIJSON,提供 nestjs 和 typeorm 的 Demo uliweb-apijsonPython 版 APIJSON,支持大部分 APIJSON 功能,支持 MySQL, PostgreSQL, SQL Server, Oracle 等 APIJSONBoot_Hive【新】APIJSON + SpringBoot 连接 Hive, Hadoop 使用的 Demo apijson-practice【新】BAT 技术专家开源的 APIJSON 参数校验注解 Library 及相关 Demo APIJSONDemo【新】APIJSON 接入 ClickHouse 使用 Demo APIJSONDemo_ClickHouse【新】APIJSON + SpringBoot 连接 ClickHouse 使用的 Demo apijson-db2APIJSON 接入 IBM 数据库 DB2 的 Demo light4j整合 APIJSON 和微服务框架 light-4j 的 Demo,同时接入了 Redis apijson-examples关于 APIJSON 包含 admin, upms, web 的多端 Demo 感谢热心的作者们的贡献,点 ⭐Star 鼓励他们继续完善吧^_^ 腾讯 APIJSON - 零代码、全功能、强安全 ORM 库 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构! https://gitee.com/Tencent/APIJSON 创作不易、坚持更难,右上角点 ⭐Star 支持下吧 ^_^

优秀的个人博客,低调大师

面试官问,Redis 是单线程还是多线程?我懵了

我们平时看到介绍 Redis 的文章,都会说 Redis 是单线程的。但是我们学习的时候,比如 Redis 的 bgsave 命令,它的作用是在后台异步保存当前数据库的数据到磁盘,那既然是异步了,肯定是由别的线程去完成的,这怎么还能说 Redis 是单线程的呢? 其实通常说的 Redis 是单线程,主要是指 Redis 对外提供键值存储服务的主要流程,即网络 IO 和键值对读写是由⼀个线程来完成的。除此外 Redis 的其他功能,比如持久化、 异步删除、集群数据同步等,是由额外的线程执⾏的。在这一点上 Node 也是一样的,一般提到 Node 也是单线程的,但其实 Node 只有一个主线程是单线程,其他异步任务则由其他线程完成。这样做的原因是防止有同步代码阻塞,导致主线程被占用后影响后续的程序代码执行。 因此,严格地说 Redis 并不是单线程。但是我们⼀般把 Redis 称为单线程高性能,这样显得 Redis 更强一些。 Redis 为什么用单线程 Redis 为什么用单线程?在回答这个问题前,先来看大家都很熟悉的数据库 MySQL,它使用的就是多线程。MySQL 不会每有一个连接就创建一个线程,因为线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等,同时也会降低计算机的整体性能。这个正是多线程会遇到的难点。 此外多线程系统中通常会存在被多线程同时访问的共享资源,比如一个共享的数据结构,当有多个进程要修改这个共享资源时,为了保证共享资源的正确性,就需要有额外的机制进行保证,而这个额外的机制,也会带来额外的开销。还是以 MySQL 举例,MySQL 引入了锁机制来解决这个问题。 从上面不难看出,多线程开发中并发访问控制是⼀个难点,需要精细的设计才能处理。如果只是简单地处理,比如简单地采⽤⼀个粗粒度互斥锁,只会出现不理想的结果。即便增加了线程,系统吞吐率也不会随着线程的增加而增加,因为大部分线程还在等待获取访问共享资源的互斥锁。而且,大部分采用多线程开发引入的同步原语保护共享资源的并发访问,也会降低系统代码的易调试性和可维护性。 而正是以上这些问题,才让 Redis 采⽤了单线程模式。 看到这里大家可能有点疑惑,前面说了 Redis 不是单线程,现在我们也说了 Redis 的键值对读写操作使用采用了单线程模式,那么它的其他线程是是什么样的呢? 主进程的其它线程 Redis 3.0 版本后,主进程中除了主线程处理网络 IO 和命令操作外,还有 3 个辅助 BIO 线程。这 3 个 BIO 线程分别负责处理,文件关闭、AOF 缓冲数据刷新到磁盘,以及清理对象这三个任务队列,从而避免这些任务对主 IO 线程的影响。 Redis 在启动时,会同时启动这三个 BIO 线程,但是 BIO 线程只有在需要执行相关类型后台任务时才会唤醒,其他时间会休眠等待任务。 多进程 除了主进程,在以下场景如果需要进行重负荷任务的处理,Redis 会 fork 一个子进程来处理: 收到 bgrewriteaof 命令: Redis fork 一个子进程,然后子进程往临时 AOF文件中写入重建数据库状态的所有命令。写入完毕后,子进程会通知父进程把新增的写操作追加到临时 AOF 文件。最后将临时文件替换旧的 AOF 文件,并重命名。 收到 bgsave 命令: Redis 构建子进程,子进程将内存中的所有数据通过快照做一次持久化落地,写入到 RDB 中。 当需要进行全量复制: master 启动一个子进程,子进程将数据库快照保存到 RDB 文件。在写完 RDB 快照文件后,master 会把 RDB 发给 slave,同时将后续新的写指令都同步给 slave。 Redis6.0 多线程 多线程是 Redis6.0 推出的一个新特性。正如上面所说 Redis 是核心线程负责网络 IO ,命令处理以及写数据到缓冲,而随着网络硬件的性能提升,单个主线程处理⽹络请求的速度跟不上底层⽹络硬件的速度,导致网络 IO 的处理成为了 Redis 的性能瓶颈。 而 Redis6.0 就是从单线程处理网络请求到多线程处理,通过多个 IO 线程并⾏处理网络操作提升实例的整体处理性能。需要注意的是对于读写命令,Redis 仍然使⽤单线程来处理,这是因为继续使⽤单线程执行命令操作,就不⽤为了保证 Lua 脚本、事务的原⼦性,额外开发多线程互斥机制了。 需要注意的是在 Redis6.0 中,多线程机制默认是关闭的,需要在 redis.conf 中完成以下两个设置才能启用多线程。 设置 io-thread-do-reads 配置项为 yes,表示启用多线程。 io-threads-do-reads yes 设置线程个数。⼀般来说,线程个数要小于 Redis 实例所在机器的 CPU 核数, 例如,对于⼀个 8 核的机器来说,Redis 官⽅建议配置 6 个 IO 线程。 io-threads 6 多线程流程 来具体看一下在 Redis6.0 中,主线程和 IO 线程是如何协作完成请求处理的。 全部流程分为以下 4 阶段: 阶段一:服务端和客⼾端建立 Socket 连接,并分配处理线程 当有客⼾端请求和实例建立 Socket 连接时,主线程会创建和客户端的连接,并把 Socket 放入全局等待队列中。然后主线程通过轮询方法把 Socket 连接分配给 IO 线程。 阶段二:IO 线程读取并解析请求 主线程把 Socket 分配给 IO 线程后,会进⼊阻塞状态等待 IO 线程完成客户端请求读取和解析。 阶段三:主线程执⾏请求操作 IO 线程解析完请求后,主线程以单线程的⽅式执⾏这些命令操作。 阶段四:IO 线程回写 Socket 和主线程清空全局队 主线程执行完请求操作后,会把需要返回的结果写入缓冲区。然后,主线程会阻塞等待 IO 线程把这些结果回写到 Socket 中,并返回给客户端。等到 IO 线程回写 Socket 完毕,主线程会清空全局队列,等待客户端的后续请求。 总结 看完了这篇文章,相信大家对 Redis 是单线程的说法已经有了大致概念。我们说它是单线程,主要是因为在以前的版本中网络 IO 和键值对读写是由⼀个线程来完成的。而之所以说 Redis 是多线程,则是因为 Redis6.0 以后的版本里,网络 IO 的部分变为了多线程处理。而且除了主线程,还有 3 个辅助 BIO 线程,分别是 fsync 线程、close 线程、清理回收线程。当然不能忘记的是,想要体验多线程机制,就得通过修改配置文件开启多线程功能。 推荐阅读 原创内容屡屡被盗?从源头对资源盗用说NO 严重危害警告!Log4j 执行漏洞被公开!

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。