查看原文
其他

Redis 有哪些内存淘汰策略?

编程导航和鱼友们 面试鸭 2024-01-21

大家好呀,今天是编程导航 30 天面试题挑战的第二十天,一起来看看今天有哪些优质面试题吧。

后端

题目一

MySQL 支持哪些存储引擎?默认使用哪个?MyISAM 和 InnoDB 引擎有什么区别,如何选择?

官方解析

MySQL 支持多种存储引擎,包括 InnoDB、MyISAM、MEMORY、CSV 等。默认情况下,MySQL 使用的存储引擎是 InnoDB

MyISAM 和 InnoDB 是 MySQL 中 最常用 的两种存储引擎,它们有以下区别:

  1. 锁定方式不同:MyISAM 使用表级锁定,而 InnoDB 使用行级锁定。在并发访问时,InnoDB 的锁定方式更加精细,可以避免锁定整个表,提高了并发性能。

  2. 数据完整性不同:MyISAM 不支持事务和外键约束,而 InnoDB 支持事务和外键约束,可以保证数据的完整性和一致性。

  3. 读写性能不同MyISAM 的读写性能相对较高,适合于读密集型应用;而 InnoDB 的写性能相对较高,适合于写密集型应用。

  4. 空间利用率不同MyISAM 不支持行级别的存储,存储空间利用率较低;而 InnoDB 支持行级别的存储,存储空间利用率更高。

在选择 MyISAM 和 InnoDB 引擎时,需要考虑应用场景和需求:

  1. 如果应用主要是读操作,可以考虑选择 MyISAM 引擎,以提高读取性能
  2. 如果应用主要是写操作需要支持事务和外键约束,可以考虑选择 InnoDB 引擎,以保证数据的完整性一致性
  3. 如果需要高性能高可用性,可以考虑选择使用 MySQL 集群或使用多个副本实例,并将数据分布在不同的节点上。

总结:MySQL 支持多种存储引擎,MyISAM 和 InnoDB 是其中最常用的两种,它们有不同的特点和优缺点,在选择时需要根据应用场景和需求进行考虑和权衡。

鱼友的精彩回答

yes.的回答

看到这个问题,我反手就是去数据库查了一下。

可以看到 Mysql 支持多种搜索引擎,默认为 InnoDB。

其中最常用的是 InnoDB 和 MyISAM,他们有以下区别:

  1. InnoDB 支持事务操作,而 MyISAM 不支持事务
  2. InnoDB 支持外键,而 MyISAM 不支持外键
  3. InnoDB 支持行级锁,表级锁,而 MyISAM 只支持表级锁
  4. InnoDB 支持数据库异常崩溃后的安全恢复(redo log),而 MyISAM 不支持
  5. InnoDB 性能比 MyISAM 更强,不管是在读写混合模式下还是只读模式下,随着 CPU 核数的增加,InnoDB 的读写能力呈线性增长。MyISAM 因为读写不能并发,它的处理能力跟核数没关系。

如果你对 B+ 树有较深的自信你还可以答

  1. InnoDB 和 MyISAM 实现索引都是使用 B+ 树,但实现方式不同

如何选择?

  • 读密集的情况下,如果你不需要事务,也不需要保证数据库的崩溃回复,可以选择 MyISAM
  • 其他时候大可放心使用 InnoDB

MySQL 高性能》上面有一句话这样写到:

不要轻易相信“MyISAM 比 InnoDB 快”之类的经验之谈,这个结论往往不是绝对的。在很多我们已知场景中,InnoDB 的速度都可以让 MyISAM 望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。

航仔丶的回答

MySQL 支持多种存储引擎,每种存储引擎都有各自的优缺点。常用的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、CSV、BLACKHOLE。其中,InnoDB 是 MySQL 默认的存储引擎。可以使用命令 SHOW ENGINES;查看当前数据库支持的存储引擎。

SHOW ENGINES

以下是 MySQL 支持的存储引擎的详细介绍:

  • InnoDB:MySQL 默认的存储引擎,支持事务、行级锁机制和外键约束,适合处理大量数据和高并发的应用场景,但对于频繁的全表扫描和大量的写操作,性能可能不如 MyISAM。
  • MyISAMMySQL 最早提供的存储引擎不支持事务、行级锁机制和外键约束,但对于只读或者大量的查询操作,性能比 InnoDB 更好。
  • Memory:这种类型的数据表只存在于内存中,使用散列索引,数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。
  • Merge:将多个相同的 MyISAM 表合并为一个虚表,常应用于日志数据仓库
  • Archive:适用于对于只偶尔需要查询的历史数据进行存储,将数据进行压缩存储占用空间小,但不支持索引和更新操作
  • CSV:将数据以CSV格式存储,适合用于导入和导出数据。
  • BLACKHOLE:这种存储引擎不实际存储数据所有写入的数据都会被丢弃,但可以记录数据的写入日志

可以通过 CREATE TABLE 语句创建表时指定使用的存储引擎,例如:

CREATE TABLE mytable (id INT, name VARCHAR(20)) ENGINE=InnoDB;  

使用 SHOW CREATE TABLE 语句可以查看表的创建语句,其中包含了使用的存储引擎。例如:

SHOW CREATE TABLE mytable;

输出结果中包含了 ENGINE=InnoDB。

  • 这两种存储引擎之间有以下区别,如何选择存储引擎取决于应用程序的需求和特点。
  1. 事务支持:InnoDB 支持事务处理,可以使用 ACID(原子性、一致性、隔离性、持久性)来保证数据的完整性和一致性。而 MyISAM 不支持事务处理,不能保证数据的一致性。如果需要使用事务,应该选择 InnoDB。

  2. 锁机制:InnoDB 采用行级锁定,只锁定需要修改的行,提高并发性能。而MyISAM采用表级锁定,会锁定整个表,如果多个用户同时访问一个表,就会出现互相等待的情况,降低并发性能。如果需要高并发性能,应该选择 InnoDB。

  3. 外键约束:InnoDB 支持外键约束,可以通过外键约束实现关联查询和级联删除等功能。而MyISAM不支持外键约束。如果需要使用外键约束,应该选 InnoDB。

  4. 性能:MyISAM在读取数据方面的性能表现较好,在大量读取的情况下效率更高。而 InnoDB 在处理事务和大量并发查询的情况下性能更好。选择存储引擎的时候需要根据应用程序的读写比例和并发性能的需求来选择。

  5. 其他:MyISAM 支持全文搜索索引,而 InnoDB 不支持。MyISAM 的表可以被压缩,而 InnoDB 的表不支持压缩。

因此,在选择存储引擎时,需要根据应用程序的需求和特点进行选择。如果需要支持事务和外键约束,以及并发性能比较重要,应该选择 InnoDB。如果需要读取数据的性能比较重要,可以选择 MyISAM。如果需要全文搜索索引或表压缩,应该选择 MyISAM。

题目二

Spring 中的 BeanFactory 和 ApplicationContext 有什么区别和联系?

官方解析

在 Spring 中,BeanFactory 和 ApplicationContext 都是用于管理 Spring Bean 的容器,它们的区别和联系如下。

区别:

  1. BeanFactory 是 Spring 框架的基础设施用于管理 Bean 的生命周期和依赖关系,提供了 IoCDI 功能。ApplicationContext 是 BeanFactory 的扩展,提供了更多的功能,例如国际化支持AOP 支持等。
  2. BeanFactory 是延迟加载的,即只有在获取 Bean 时才会进行实例化,可以减少系统资源的占用。而 ApplicationContext 在启动时会立即加载所有的 Bean,导致启动时间较长。
  3. BeanFactory 是单例模式,即在整个应用中只有一个 BeanFactory 实例。而 ApplicationContext 可以有多个实例,并且可以通过父子容器的方式组织起来,方便模块化开发。
联系:
  1. BeanFactory 和 ApplicationContext 都是用于管理 Spring Bean 的容器,可以管理 Bean 的生命周期和依赖关系,提供了 IoCDI 功能。
  2. ApplicationContext 是 BeanFactory 的扩展,提供了更多的功能,例如国际化支持、AOP 支持等,同时也支持 BeanFactory 的所有功能
  3. BeanFactory 和 ApplicationContext 都可以管理单例 Bean 和原型 Bean,可以控制 Bean 的作用域和生命周期

总结:BeanFactory 是 Spring 框架的基础设施,提供了 IoC 和 DI 功能,而 ApplicationContext 是 BeanFactory 的扩展,提供了更多的功能和扩展性,可以通过多种方式进行配置和管理 Spring Bean。

鱼友的精彩回答

CodeJuzi的回答

BeanFactory 和 ApplicationContext 是 Spring 框架中的两个核心接口,它们的主要区别如下:

  • 容器加载方式不同:BeanFactory 是 Spring 框架最基础的容器,提供了最基本的依赖注入和对象生命周期管理等功能。ApplicationContext 是 BeanFactory 的子接口,它在 BeanFactory 的基础上增加了很多特性,比如国际化、事件机制等,并且在容器启动时就预先加载了所有的 bean

  • 容器管理范围不同:BeanFactory 是 Spring 框架的最基础容器,只提供了基本的 Bean 管理功能,通常在小型应用中使用。ApplicationContext 是更高级的容器,能够在启动时预先加载所有的 Bean,并提供了更多的应用功能,通常在中大型应用中使用。

  • 容器启动速度不同BeanFactory 启动较快:BeanFactory 只在实际获取 Bean 时才会去加载 Bean,因此启动速度较快。而 ApplicationContext 在启动时会预先加载所有的 Bean,因此启动速度较慢,但是获取 Bean 的速度较快

  • 自动装配方式不同:BeanFactory 提供的自动装配功能比较有限,只能通过配置文件进行装配。ApplicationContext 则提供了更强大的自动装配功能,可以通过注解、Java 配置等方式进行装配。

  • 容器销毁时的处理不同:BeanFactory 容器中的 Bean 是延迟加载的,容器销毁时不会自动销毁 Bean,需要手动进行销毁。ApplicationContext 容器中的 Bean 在容器销毁时会自动进行销毁。

=> 综上考虑,在使用 Spring 框架时,通常会优先选择使用 ApplicationContext,因为它提供了更多的功能,并且性能相对也更好。在特殊场景下,比如应用程序比较小,并且对性能要求较高,那么可以考虑使用 BeanFactory。

HeiHei 的回答

BeanFactory 是 Spring 容器的超级接口。ApplicationContext 是 BeanFactory 的子接口

区别:
  • BeanFactory:Spring IoC 容器的顶级对象,BeanFactory被翻译为“Bean工厂”,在Spring的IoC容器中,“Bean工厂”负责创建Bean对象。BeanFactory是工厂。提供了基本的依赖注入和控制反转功能,它可以加载配置文件中定义的bean,并管理它们的生命周期。
  • ApplicationContext 是 BeanFactory 的一个子接口,它在 BeanFactory 的基础上增加了更多的企业级功能,例如事件发布、资源处理、AOP等。ApplicationContext 还可以自动识别 Spring 框架内置的 bean,并对它们进行预处理。

题目三

讲一下 Redis 中的内存淘汰机制、有哪些内存淘汰策略?

官方解析

Redis 是一种基于内存的键值数据库,由于内存有限,当 Redis 占用的内存达到上限时,就需要进行内存淘汰,以腾出一些内存空间。

Redis 中的内存淘汰机制包括:

  1. 定期删除:Redis 可以设置一个定时器,定期扫描键空间中的键,并删除已经过期的键。
  2. 惰性删除:当一个键过期时,Redis 不会立即删除该键,而是等到该键被访问时再删除。
  3. 内存淘汰策略:当 Redis 内存占用达到上限时,会根据内存淘汰策略来选择一些键进行删除,以腾出更多的内存空间。

Redis 中的内存淘汰策略包括:

  1. noeviction:禁止删除键,即不做任何操作。
  2. allkeys-lru:从所有的键中选择最近最少使用的键进行删除。
  3. allkeys-random:从所有的键中随机选择一些键进行删除。
  4. volatile-lru:从已设置过期时间的键中选择最近最少使用的键进行删除。
  5. volatile-random:从已设置过期时间的键中随机选择一些键进行删除。
  6. volatile-ttl:从已设置过期时间的键中选择剩余时间最短的键进行删除。

其中,noeviction 策略是最简单的策略,但可能会导致 Redis 内存占满,并导致 Redis 无法正常工作。其他策略则会根据不同的算法进行键的选择和删除,以尽可能地保留重要的键。

总之,Redis 中的内存淘汰机制是保证 Redis 正常运行的重要机制之一,内存淘汰策略则根据不同的场景选择合适的策略来删除不必要的键,以腾出更多的内存空间。

鱼友的精彩回答

9915-java-木木的回答

Redi 中的内存淘汰机制是指当Redis作为缓存使用时,他可以自动删除旧的数据以添加新的数据。这样可以避免内存溢出的情况。

Redis 有以下几种内存淘汰策略:

  • noeviction:当内存打到限制时,不删除任何键,而是返回错误;
  • allkeys-lru:当内存达到限制时,删除最近最少使用(LRU)的键;
  • volatile-lru:当内存达到限制时,删除设置了过期时间并且最近最少使用的键;
  • allkeys-random:当内存达到限制时,随机删除任意键;
  • volatile-random:当内存达到限制时,随机删除设置了过期时间的键;
  • volatile-ttl:当好内存达到限制时,删除设置了过期时间并且剩余生存时间最短的键。

如何设置 Redis 的内存淘汰策略

  • Redis 的配置文件中,找到 maxmemory 和 maxmemory-policy 两个参数;
  • 将 maxmemory 设置为你想要的内存限制,比如 100 Mb;
  • 将 maxmemory-policy 设置为你想要的内存淘汰策略,例如 allkeys-lru
  • 保存配置文件并重启 Redis 服务

也可以通过命令行动态修改这两个参数。

>redis-cli config set maxmemory 1--mb  
>redis-cli config set maxmemory-policy allkeys-lru

前端

题目一

JS 代码中的 use strict 是什么?有什么作用?

官方解析

"use strict" 是 ECMAScript 5 引入的一种严格模式,它用于指示 JavaScript 引擎采用更严格的解析和执行模式。

当在 JavaScript 代码中使用 "use strict" 声明时,代码将会在严格模式下执行。严格模式包含了一些额外的规则和限制,有助于开发者避免一些常见的错误。

使用 "use strict" 的主要作用包括:

  1. 消除 JavaScript 中的一些不合理、不安全的语法,减少代码出错的可能性。
  2. 防止使用未声明的变量、函数,强制开发者进行声明。
  3. 强制函数中的 this 值只能在函数内部使用,避免在全局作用域中误用 this 值。
  4. 禁止删除变量、函数等,避免意外删除重要的变量和函数。
  5. 提高代码性能,因为 JavaScript 引擎可以更好地进行优化。

使用 "use strict" 的方式有两种:

  1. 在 JavaScript 文件开头使用 "use strict"。
  2. 在函数体内第一条语句中使用 "use strict"。

例如,在 JavaScript 文件开头使用 "use strict" 的方式如下:

"use strict";
var x = 1;

在函数体内第一条语句中使用 "use strict" 的方式如下:

function myFunction() {
  "use strict";
  var x = 1;
}

总之,"use strict" 是一种在 JavaScript 中使用严格模式的方法,它可以提高代码的可靠性和性能,避免一些常见的错误。

鱼友的精彩回答

你还费解吗的回答

严格模式的简介

"user strict" 是 ES5 新增的一个预处理指令,它不是一条语句,而是一个字面量表达式,能为代码开启严格模式(Strict Mode)

严格模式是一种具有限制性的 JavaScript 模式,能让浏览器以更加严格、规范的方式对代码进行检测和执行。严格模式可以应用在两个地方,一个是 JS 文件的开头,也就是在头部加上 "use strict";,这会为整个脚本开启严格模式;另一个则是函数体开头,也就是在函数内部的最顶端加上 "use strict";,这指定了函数会在严格模式下执行。

严格模式的限制 JavaScript 在最初设计时,为了让开发者能快速上手,没有对语法做严格的限制,从而导致了一些不合理的代码能被正常解析和运行,但这会带来一些安全隐患,例如,变量可以直接使用,不使用关键字声明:x = 1;,这显然是不合理的,任何变量理应在声明后才能使用。在严格模式中,为了使代码更加规范、合理,做了以下限制:

  1. 变量必须声明后再使用,不能通过不使用关键字创建全局变量
  2. 不能通过 delete 操作符删除变量(包括对象和函数)
  3. 不允许使用转义字符
  4. 不允许函数参数重名
  5. 变量名不能使用 eval 或 arguments
  6. 不能使用 0 作为开头表示八进制,而是应使用 0o
  7. 禁止 this 默认指向全局对象 window
  8. 不可修改对象的只读属性(writable = false)
  9. 不可使用 delete 操作符删除对象的不可配置属性(configurable = false)
  10. 不能修改对象中只定义了 getter() 无设置 setter() 的属性
  11. 不能读取对象中只定义了 setter() 无设置 getter() 的属性
  12. 不能使用 with 语句
  13. eval 不会在它的外层作用域引入变量
  14. 淘汰 arguments.callee 和 arguments.caller
  15. 增加了一些保留字,不能作为变量名:implements、interface、let、package、private、protected、public、static、yield。

优点和缺点

优点:

  • 消除 JS 语法的一些不合理、不严谨之处,减少一些怪异行为。
  • 提高代码的可靠性和可维护性,避免代码运行时出现意外。
  • 提高编译器效率,增加代码运行速度。

缺点:

  • IE10 以下不支持严格模式。
  • 由于某些库和框架可能依赖于 JS 的一些非标准行为,在严格模式下这些行为可能会失效。
  • 如今大部分网站都会对 JS 进行合并压缩,一些文件开启了严格模式,而另一些没有。这些原本是严格模式的文件被压缩后就成为了大文件的某一部分,不仅没有了严格模式,还在压缩后浪费了字节。

注意:ES6 的模块自动采用严格模式,不管有无在头部加上 "use strict";。

题目二

什么是前后端分离?它有什么优点和缺点?

官方解析

前后端分离是指将前端和后端分别进行独立开发和部署。使前端和后端分别由不同的开发团队负责,通过 API 接口进行数据交互。前端负责页面展示和用户交互,后端负责业务逻辑和数据存储,两者通过 API 进行通信。

前后端分离的优点包括:

  1. 分工明确:前端和后端分别由不同的开发团队负责,各司其职,有利于开发流程的管理和控制。
  2. 前后端解耦:前后端分离可以使前端和后端解耦,前端只关注页面展示和用户交互,后端只关注业务逻辑和数据存储,有利于模块化开发和维护。
  3. 更好的性能和用户体验:前后端分离可以使前端采用现代化的前端框架和技术,提高网站的性能和用户体验。
  4. 更好的可扩展性:前后端分离可以使后端提供更丰富的 API,方便前端进行开发和维护,同时也使得后端更易于扩展和修改。

前后端分离的缺点包括:

  1. 开发难度增加:前后端分离需要前端和后端分别进行开发,需要更多的协调和沟通,开发难度增加。
  2. 维护难度增加:前后端分离使得前端和后端的代码分离,需要分别进行维护,维护难度增加。
  3. 安全问题:前后端分离可能会导致一些安全问题,例如跨站点脚本攻击(XSS)和跨站点请求伪造(CSRF),需要采取相应的安全措施来解决。

总之,前后端分离有其优点和缺点。前后端分离可以提高开发效率、网站性能和用户体验,但也可能会增加开发和维护的难度,需要采取相应的措施来解决。

题目三

前端性能优化指标有哪些?怎么进行性能检测?

官方解析

前端性能优化主要是通过一系列技术手段和优化策略来提升网站或应用的性能,从而提高用户的体验。下面列举一些常见的前端性能优化的指标和性能检测的方法:

  1. 加载速度:网站或应用的加载速度是用户体验的重要因素。可以使用工具(如 WebPagetest、PageSpeed Insights)来测试网站或应用的加载速度,并通过优化图片大小、减少 HTTP 请求、使用浏览器缓存等方式来提升加载速度。
  2. 渲染速度:渲染速度是指页面加载完成后页面内容渲染的速度。可以使用 Chrome 开发者工具中的 Performance 面板来检测页面渲染速度,并通过减少 DOM 操作、使用 CSS3 动画、减少 JavaScript 的执行时间等方式来提升渲染速度。
  3. 响应速度:响应速度是指网站或应用处理请求的速度。可以使用工具(如 Pingdom、GTmetrix)来测试响应速度,并通过优化服务器响应时间、压缩 JavaScript 和 CSS 文件等方式来提升响应速度。
  4. 可访问性:可访问性是指网站或应用是否易于使用和访问。可以通过使用 HTML5、WAI-ARIA 标准、有意义的网页标题、有意义的链接等方式来提高可访问性。
  5. 移动端性能:随着移动设备的普及,移动端性能越来越重要。可以使用工具(如 Google Mobile-Friendly Test)来测试移动端性能,并通过使用响应式设计、优化图片和视频大小、使用 viewport meta 标签等方式来提高移动端性能。

总结:前端性能优化指标包括加载速度、渲染速度、响应速度、可访问性和移动端性能等方面。可以使用各种工具来检测这些指标,并采取相应的优化策略来提高网站或应用的性能。

鱼友的精彩回答

mumu的回答

前端性能可以通过打开「Lighthouse」查看:

  • 首次渲染时间:测量页面第一次呈现内容的时间,包括 HTML、CSS 和 JavaScript 的加载时间。
  • 首次交互时间:测量从页面开始加载到用户首次可以与页面进行交互的时间,例如点击按钮或滚动页面。
  • 速度指数:测量页面渲染速度的指标,即页面中可见内容的加载速度,以及非可见内容的加载速度。
  • 页面加载时间:测量从发出请求到页面加载完成的时间,包括所有资源的加载时间。
  • 可见最大内容检测:用于衡量页面渲染性能和用户体验。它衡量的是在页面上出现的最大可见内容的加载时间,例如图片、视频、文字等。LCP 的目标是在页面开始加载后的前 2.5 秒内完成加载。
  • 累积布局移位:衡量的是页面在加载和渲染时发生的不必要布局变化的数量和程度,例如当页面元素在加载时被推下或移动时发生的不必要跳动。CLS 值应该越小越好,建议小于 0.1

星球活动

1.欢迎参与 30 天面试题挑战活动 ,搞定高频面试题,斩杀面试官!

2.欢迎已加入星球的同学 免费申请一年编程导航网站会员

3.欢迎学习 鱼皮最新原创项目教程,手把手教你做出项目、写出高分简历!

加入我们

欢迎加入鱼皮的编程导航知识星球,鱼皮会 1 对 1 回答您的问题、直播带你做出项目、为你定制学习计划和求职指导,还能获取海量编程学习资源,和上万名学编程的同学共享知识、交流进步。

💎 加入星球后,您可以:

1)添加鱼皮本人微信,向他 1 对 1 提问,帮您解决问题、告别迷茫!点击了解详情

2)获取海量编程知识和资源,包括:3000+ 鱼皮的编程答疑和求职指导、原创编程学习路线、几十万字的编程学习知识库、几十 T 编程学习资源、500+ 精华帖等!点击了解详情

3)找鱼皮咨询求职建议和优化简历,次数不限!点击了解详情

4)鱼皮直播从 0 到 1 带大家做出项目,已有 50+ 直播、完结 3 套项目、10+ 项目分享,帮您掌握独立开发项目的能力、丰富简历!点击了解详情

外面一套项目课就上千元了,而星球内所有项目都有指导答疑,轻松解决问题

星球提供的所有服务,都是为了帮您更好地学编程、找到理想的工作。诚挚地欢迎您的加入,这可能是最好的学习机会,也是最值得的一笔投资!

长按扫码领优惠券加入,也可以添加微信 yupi1085 咨询星球(备注“想加星球”):


往期推荐

TCP 和 UDP 协议有什么区别?

什么是单例模式?

怎么解决跨域问题?

synchronized 是什么,有什么作用?

Redis 的持久化机制有哪些?

如何使用 Redis 实现一个排行榜?


继续滑动看下一个

Redis 有哪些内存淘汰策略?

编程导航和鱼友们 面试鸭
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存