网易牛客面经整理 没回答上来的 varchar和text的字段的区别
1 2 varchar是可变长度的字符串,需要自定义长度,可以加索引,适合存储短的文本数据 text字段是存放长文本数据的地方,存储在单独存储区,表中保存额外的指针,只能部分索引(前255字符)
后端调用Test字段的一些注意事项
1 2 3 4 5 6 7 8 9 10 11 12 13 TEXT 有不同的子类型,每种类型的最大长度不同: TINYTEXT: 最多 255 字节。 TEXT: 最多 65,535 字节。 MEDIUMTEXT: 最多 16,777,215 字节。 LONGTEXT: 最多 4,294,967,295 字节。 分页和摘要 因为text字段,表里只存放指针,MySQL还需要二次查询 会影响查询性能,所以我们做了一个分表 将text列分离到单独的扩展表中,用ID字段做一个关联 然后,创建一个varchar(255)字段,来记录text的前255个字符作为摘要 这样在分页查询的时候,文章内容我们就只需要查询这个varchar字段就行 点进去具体查询的时候,就需要关联text表查询text字段了
如何提取
1 2 3 4 5 6 7 SUBSTRING 函数(在某些数据库中也叫 SUBSTR 函数)用于从一个字符串中提取子字符串。在 UPDATE 语句中,SUBSTRING(content, 1, 255) 这部分代码的作用是从 content 字段的第一个字符开始,提取长度为 255 的子字符串。这样,你可以把 content 字段中的前 255 个字符提取出来,并赋值给 summary 字段。 具体来说: content 是 TEXT 字段,其中存储了长文本内容。 SUBSTRING(content, 1, 255) 从 content 字段的第一个字符开始,提取长度为 255 的子字符串。 SET summary = SUBSTRING(content, 1, 255) 将提取出来的子字符串赋值给 summary 字段。
1 2 3 如果一定要使用,建议把 BLOB 或是 TEXT 列分离到单独的扩展表中, 查询时一定不要使用 `select *`而只需要取出必要的列, 不需要 TEXT 列的数据时不要对该列进行查询。
算法题:算法题,云音乐的歌单列表,调整顺序后需要保存到数据库,如何让每次保存的数据量最小,答使用数组标识该歌单是否有顺序调整,最后只更新有发生变化的那些数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 量更新,可以最大程度地减少数据库操作的次数,提高系统性能和效率。实现方法如下: 使用数组标识顺序是否调整: 维护一个与歌单列表对应的布尔数组,用于标识每个歌单是否发生了顺序调整。数组的索引对应着歌单在列表中的位置,数组的值表示该位置的歌单是否发生了顺序调整。 调整歌单顺序时更新数组: 当用户调整歌单的顺序时,相应地更新数组中对应位置的标记为true,表示该歌单发生了顺序调整。 保存数据时只更新发生变化的数据: 在保存歌单数据到数据库时,遍历数组,只更新标记为true的位置对应的歌单数据,其他位置的数据不进行更新。 更新完成后,将数组重置为全false,等待下一次用户进行歌单顺序调整时再次更新。 这种方法有效地减少了数据库操作的次数,只更新发生变化的数据,节省了系统资源,提高了系统的性能和效率。
场景题:以微信朋友圈为例,你思考一下除了用户表之外需要建几张表才能实现微信朋友圈这个业务,并且每张表有哪些字段,你可以先思考一下再说?
1 2 3 4 5 6 微信朋友圈实现的功能,有点赞,评论,好友关系,用户朋友圈的内容等 所以至少先需要点赞,评论,好友关系,朋友圈内容等 点赞表:巴拉巴拉 评论表:巴拉巴拉 好友关系表:巴拉巴拉 内容表:巴拉巴拉
Java集合类,如何处理hash冲突
1 具体而言,当发生哈希冲突时,HashMap 会将具有相同哈希码的键值对存储在同一个桶(bucket)中,而不是简单地覆盖原来的值。这个桶通常是一个链表或者是红黑树。在 Java 8 之后的版本中,当链表长度超过一定阈值(默认为 8)时,链表会被转换为红黑树,以提高查询效率。
Java的单例模式,枚举类enum
1 2 用于定义一组有限的常量。 它提供了一种更好的方式来表示常量集合,使代码更具可读性和可维护性。
Spring的单例模式,怎么实现的?
1 单例模式的实现是通过 Spring 容器管理 Bean 的方式来实现的。默认情况下,Spring 容器创建的 Bean 都是单例的,也就是说在整个应用程序中只会创建一个该类型的实例。
mysql的索引讲一下,一级和二级索引的区别,什么时候可以不用查一级索引。答覆盖索引。
1 2 3 4 5 6 7 8 9 一级索引(Primary Index): 一级索引是指直接基于表的主键构建的索引,主键索引是一种唯一性索引,能够确保表中每行数据的唯一性。 主键索引通常是聚簇索引,即索引的叶子节点存储了整行数据,因此主键索引能够加速基于主键的单行数据查询。 二级索引(Secondary Index): 二级索引是指基于表的非主键列构建的索引,用于加速对非主键列的查询操作。 二级索引通常是非聚簇索引,即索引的叶子节点存储了索引字段的值以及指向对应行的主键值,因此在使用二级索引进行查询时,需要先查找索引,然后再根据主键值找到对应的数据行。 覆盖索引是指查询语句的执行过程中,只需通过索引就能够获取到所需的数据,而不需要再访问数据表。当查询语句的列都包含在索引中时,就可以利用覆盖索引,这样能够减少IO操作和数据传输,提高查询效率。
Redis使用keys遍历所有的key,存在问题?如何解决?
1 2 3 4 5 6 7 8 9 10 性能问题:性能低下 阻塞问题:阻塞服务器,直到命令执行完成 为了解决这个问题,可以采用以下几种方式: 使用 SCAN 命令:SCAN 命令是一个迭代器命令,可以逐步遍历符合给定模式的所有键,它不会像 keys 命令那样阻塞 Redis 服务器,并且可以分批次地获取数据,避免一次性遍历大量数据造成的性能问题。 避免在生产环境使用:在生产环境中尽量避免使用 keys 命令,特别是在大规模的 Redis 实例中,因为它会对 Redis 服务器造成较大的压力。可以在开发和测试环境中使用 keys 命令进行调试和测试,但不要在生产环境中频繁地使用。 使用有序集合或哈希表替代:如果需要根据模式查询键值对,可以考虑使用有序集合(Sorted Set)或哈希表(Hash)来存储数据,然后通过范围查询或哈希键查询来获取数据,这样可以更高效地进行查询操作。
死锁,解决办法
1 2 3 4 5 6 7 8 9 10 11 12 死锁是指两个或多个线程(或进程)相互持有对方所需的资源,并且在等待对方释放资源时都无法继续执行的情况。死锁常常发生在多线程并发执行的情况下,当线程之间竞争资源时,如果不恰当地处理资源获取顺序,就容易导致死锁的发生。 发生死锁的必要条件包括: 互斥条件(Mutual Exclusion):资源只能被一个线程(或进程)占用,当资源被占用时,其他线程无法同时访问该资源。 请求和保持条件(Hold and Wait):线程持有至少一个资源,并且正在等待获取另一个被其他线程持有的资源。 不可剥夺条件(No Preemption):线程无法强制从其他线程手中夺取资源,只能通过自愿释放资源来解决资源争用问题。 循环等待条件(Circular Wait):存在一个资源循环等待链,即线程 A 等待线程 B 持有的资源,线程 B 等待线程 C 持有的资源,...,线程 N 等待线程 A 持有的资源。 解决:资源分配有序性:尽量避免线程持有多个资源而等待其他线程释放资源的情况发生, 可以采用一种资源分配有序性的策略,例如按照资源的编号顺序来申请资源, 或者尽量减少线程持有的资源数量,以降低发生死锁的概率。
springboot的starter了解过吗
1 2 3 Spring Boot Starter 是一组依赖的集合,它们打包成一个模块, 通过添加该模块到项目的依赖中,自动引入所需的库和自动配置,简化项目的搭建过程。 常见的就是,web-starter,mybatis-starter等
Springboot的自动配置
1 2 3 4 5 6 Spring Boot 的自动配置(Auto Configuration)通过扫描类路径中的依赖和应用配置, 根据项目中的类和配置的存在与否自动配置 Spring 应用程序。 它利用 @EnableAutoConfiguration 注解和 META-INF/spring.factories 文件中的配置, 将常见的配置任务自动化。这样,开发者可以省去大量手动配置,只需专注于业务逻辑。 自动配置可以通过 application.properties 文件进行调整和覆盖, 并可通过 @Conditional 注解进行条件性配置。
数据库连接池,Spring还是mybatis管理的?
1 2 3 4 数据库连接池通过预创建和管理一组数据库连接,允许多个线程重复使用这些连接, 从而提高性能和资源利用率。常见的实现包括 HikariCP、C3P0 和 DBCP。 在 Spring 项目中,通常由 Spring 管理连接池,通过配置数据源(DataSource)来集成连接池。 MyBatis 则通过配置文件或 Spring 管理的 DataSource 来使用连接池,从而实现高效的数据库连接管理。
mybatis怎么将Java对象映射到数据库的
1 2 3 4 MyBatis 通过 XML 配置文件或注解,将 Java 对象与数据库表映射。 它使用 Mapper 接口定义 SQL 操作,通过配置文件中的 SQL 语句或注解中的 SQL 语句来执行数据库操作。 MyBatis 利用反射和动态代理,将查询结果映射为 Java 对象,或将 Java 对象属性映射为 SQL 参数, 从而实现对象与数据库记录的映射和持久化。
redis最大内存设置了多少,超过了最大内存会怎样?
1 2 3 4 5 Redis 的最大内存可以通过 maxmemory 配置项设置。 如果内存使用超过了设置的最大内存,Redis 会根据 maxmemory-policy 配置项决定如何处理。 常见策略包括:移除最近最少使用(LRU)的键、移除最少频繁使用(LFU)的键、 移除即将过期的键、或者不再允许新的写操作(只读模式)。 如果没有合适的策略,可能会导致 Redis 无法正常服务。
redis持久化有哪些方式,项目中用的哪一种,默认是哪一种
1 2 3 4 5 Redis 持久化方式主要有两种:RDB(Redis Database)和 AOF(Append Only File)。 RDB 方式通过周期性快照保存数据,适用于不需要频繁写操作的数据备份。 AOF 方式记录每个写操作日志,更适合需要数据完整性的应用。 默认情况下,Redis 使用 RDB 持久化。 在项目中,根据需求可以选择混合使用 RDB 和 AOF 来兼顾性能和数据安全。
线程池
1 2 3 4 5 6 7 8 9 10 11 12 13 线程池:管理线程的池子,可以容纳多个线程,省去了频繁创建线程的操作 Java中有几种常见的线程池,都是去实现了ThreadPoolExecutor这个类 用这个类的构造器,去设置参数,核心线程,最大线程,超时时长,任务队列等 可以直接用,然后重写run方法实现的 设计一个线程池嘛 1.创建N个线程 2.把任务提交给线程运行 3.线程满的话,就放入队列 4,空闲时,从队列去除执行 使用场景:异步处理的时候要用到线程池开启线程,并发处理的时候也需要
乐观锁和悲观锁
1 2 3 4 乐观锁和悲观锁是并发控制的两种策略。 乐观锁假设数据不会被同时修改,每次操作前不加锁, 而在更新时比较数据版本号等,若未被修改则更新成功; 悲观锁则假定数据会被其他事务修改,因此在读取和更新数据前先加锁,以防止其他事务修改。
Tomcat怎么做优化的
1 2 3 Tomcat优化包括调整线程池大小、调整内存分配、启用压缩、 使用连接池、启用缓存等。通过调整这些参数可以提高 Tomcat的性能和稳定性,降低资源消耗,提高并发处理能力。
String是基本类型吗,为什么可以用+操作
1 2 3 不是,String是类 基本类型,int,char,boolean short,long,float,double这些 +底层是通过StringBuilder实现的
RabbitMQ的应用场景
1 2 3 4 5 6 1,异步消息的传递,错峰削骨,我项目中的先处理抢购成功的消息,再异步处理订单的消息 2.应用解耦,微服务架构中,各个服务组件需要通信协作,通过消息中间件作为联系 3.任务队列:,用于将任务分发给多个消费者进行处理。这种方式可以实现任务的负载均衡和并行处理,提高了任务处理的效率和可靠性。 4.日志收集:在分布式系统中,需要收集和统计各个节点的日志信息。 通过将日志消息发送到RabbitMQ中,可以集中管理和存储日志数据, 并提供查询和分析功能,帮助监控系统的运行状态。
RabbitMQ如何保证消息的连续性
1 2 3 4 5 1,消息确认机制:confirm 手动确认(manual ack):消费者在处理完消息后手动发送确认消息给RabbitMQ,告诉它可以删除该消息。 自动确认(auto ack):RabbitMQ在将消息发送给消费者后立即将消息标记为已确认,无需消费者手动确认。 2.持久化消息,确保连续性 在生产者发送消息时,可以将消息标记为持久化(persistent),这样即使RabbitMQ宕机或者重启,消息也不会丢失。
Spring定时调度
1 2 定时调度任务可以通过使用 @Scheduled 注解来实现。 @Scheduled 注解可以用于标注在一个方法上,使其在特定的时间间隔或特定的时间点执行
基础: 1.Java类加载过程 2.知道类加载优先级机制吗 3.介绍下双亲委派,可以被打破吗 4.讲一下HashMap是怎么实现扩容的 5.HashMap为什么线程不安全 6.为什么头插法改成尾插法 7.有线程安全的Map结构吗 8.ConcurrentHashMap中CAS加在哪里,Synchronized加在哪里 9.ArrayList、LinkedList有哪些区别,在性能上是什么区别 10.O(1)级别插入和查询的数据结构 11.AQS的原理 12.AQS有哪些应用 13.用过哪些锁 14.了解CountDownLatch吗 15.ThreadLocal底层实现是怎样的 16.有用过CompletableFuture吗,底层是如何实现的 17.线程之间传递参数,有哪几种方式 18.线上一个应用进程,突然之间CPU100%了,怎样去定位是哪里出了问题 19.Jdk17和1.8的主要区别 20.偏向锁原先是被用在哪里的,为什么被废除了 21.介绍下索引的底层结构及为什么用 22.B+树的高度一般是多少 23.有没有遇到过B+树叶分裂的问题 24.让你设计一张表,主键一般选择什么数据类型 25.Redis的持久化有哪几种方式 26.Redis缓存过期策略有哪些 27.IOC的实现原理和好处是什么 28.IOC底层比较重要的BeanFactory和FactoryBean的关系是什么 29.AOP的具体底层是怎么做的 30.RocketMQ的底层了解多少 31.RocketMQ的工作流程是什么 32.你是怎么理解NameServer的 33.有用过Dubbo吗,整体架构是怎样的 34.算法:快速幂
作者:景洪 链接:https://www.nowcoder.com/feed/main/detail/d94acc1939864dfaa82e6c7954e8311b?sourceSSR=dynamic 来源:牛客网