手机网站制作 费怎么做分录,网站域名hk,大丰做网站建设的公司,最新楼盘价格走势图问题列表 为什么选择 spring boot 框架#xff0c;它与 Spring 有什么区别#xff1f;spring mvc 的执行流程是什么#xff1f;如何实现 spring 的 IOC 过程#xff0c;会用到什么技术#xff1f;spring boot 的自动化配置的原理是什么#xff1f;如何理解 spring boot 中… 问题列表 为什么选择 spring boot 框架它与 Spring 有什么区别spring mvc 的执行流程是什么如何实现 spring 的 IOC 过程会用到什么技术spring boot 的自动化配置的原理是什么如何理解 spring boot 中的 starspring boot 为什么要用嵌入式的 web 容器利用 REDIS 存储数据的原则是什么如果 dB 的数据发生变更如何更新缓存内的数据如果流量很大REDIS 挂了会发生什么采取的措施是什么有什么兜底的方案造成 REDIS 挂掉的原因有哪些什么是数据的倾斜如何预防数据的倾斜REDIS6.0 的多线程是怎样的有没有遇到过 REDIS 突然变慢的情况原因是什么REDIS 的内存碎片是怎么造成的REDIS 是如何支持原子操作的在订单每天都是百万级别的数据量且超过 30 分钟未支付系统自动取消订单的场景下如何设计把订单的状态改为取消订单系统中 MQ 的具体使用场景是什么如何保证 MQ 消息的幂等rocket mq 是如何保证消息不丢失的有没有做过相关设置微服务拆分的原则是什么微服务中分布式事务的具体解决的方案是什么采用的 Seata 是用的哪种模式其执行过程是什么这种模式下的隔离级别和 MYSQL 的隔离级别有什么不一样会不会有什么问题如何解决公司的 SQL 语句规范是什么表在建立索引的时候有什么原则为什么不建议用 uuid 作为 MYSQL 的主键索引select 语句的查询过程是什么如何预防回表在线上给一个小表加了个字段结果导致整个库都挂了原因是什么如何解决MYSQL 中是如何出现死锁的在设计表的时候如何减少锁的冲突单点登录系统是用什么协议来实现的如何解决 token 或 session 的跨域问题如何设计和实现微信扫码登录的功能 面试题答案
Spring相关
为什么选择Spring Boot框架它与Spring有什么区别 选择原因快速构建项目简化配置有大量starter依赖自动配置减少开发工作量内置服务器便于部署和运行。区别Spring是一个框架体系需大量配置Spring Boot基于Spring以约定大于配置为核心简化配置更易上手和快速开发。 Spring MVC的执行流程 用户发送请求到DispatcherServlet。DispatcherServlet查询HandlerMapping找到对应的Handler。调用HandlerAdapter执行Handler。Handler执行完成返回ModelAndView给DispatcherServlet。DispatcherServlet通过ViewResolver解析视图并渲染将结果返回给用户。 如何实现Spring的IOC过程会用到什么技术 实现方式通过配置文件或注解定义BeanSpring容器负责创建和管理Bean。技术反射用于创建对象依赖注入通过构造函数、Setter方法等实现。 Spring Boot的自动化配置的原理 基于条件注解根据类路径下是否存在某些类、Bean等条件决定是否自动配置某个功能。通过ConfigurationProperties绑定配置属性EnableAutoConfiguration开启自动配置读取META-INF/spring.factories文件中的自动配置类进行加载和配置。 如何理解Spring Boot中的starter Starter是一组依赖描述符将相关的依赖和配置整合在一起。用户只需引入starter依赖Spring Boot就能自动配置相关功能简化依赖管理和配置如spring-boot-starter-web引入后可快速搭建Web项目。 Spring Boot为什么要用嵌入式的web容器 便于快速部署和运行无需单独安装和配置外部Web容器。可将应用打包成可执行的jar或war文件直接运行提高开发和部署效率便于在不同环境中快速迁移和部署。
Redis相关 利用REDIS存储数据的原则是什么 数据读写频繁、对读写速度要求高的适合存Redis。如缓存热点数据、实时统计数据、分布式锁等。要考虑数据的生命周期合理设置过期时间避免内存占用过多。 如果DB的数据发生变更如何更新缓存内的数据 采用缓存更新策略有先更新数据库再更新缓存、先删除缓存再更新数据库、先更新数据库再异步删除缓存等方式。根据业务场景选择合适策略注意数据一致性问题。 如果流量很大REDIS挂了会发生什么采取的措施是什么有什么兜底的方案 发生情况缓存失效大量请求直接访问数据库可能导致数据库压力过大甚至崩溃系统响应变慢部分业务可能无法正常处理。措施采用Redis集群增加节点提高可靠性和性能开启持久化保证数据不丢失。兜底方案使用本地缓存做临时过渡对数据库进行限流、降级等操作保证核心业务可用。 造成REDIS挂掉的原因有哪些 内存不足超出最大内存限制。网络故障节点之间通信异常。大量请求导致CPU使用率过高。持久化出现问题如磁盘空间满等。软件或硬件故障等。 什么是数据的倾斜如何预防数据的倾斜 定义数据在Redis集群节点中分布不均匀部分节点数据量过大部分节点数据量很少导致负载不均衡。预防合理设计数据分片策略采用一致性哈希等算法。对数据进行预处理将数据均匀分布。监控数据分布情况及时调整。 REDIS6.0的多线程是怎样的 Redis 6.0引入多线程主要用于网络I/O读写提高网络读写性能。多线程负责读取请求、解析命令、发送响应等操作数据处理仍由单线程执行避免了多线程数据竞争问题通过配置参数可调整线程数量等。 有没有遇到过REDIS突然变慢的情况原因是什么 内存不足触发内存淘汰策略导致数据读写变慢。有大量复杂的慢查询命令阻塞了Redis线程。网络带宽不足或网络延迟高。持久化操作频繁影响了读写性能。CPU负载过高忙于处理其他任务。 REDIS的内存碎片是怎么造成的 内存分配器分配和释放内存时由于分配的内存块大小和实际使用的内存大小不一致多次分配和释放后就会产生内存碎片。例如频繁地创建和删除不同大小的键值对会导致内存空间不连续形成碎片。 REDIS是如何支持原子操作的 Redis通过单线程和命令队列来实现原子操作。单线程保证了同一时间只有一个命令在执行不会被其他命令打断。命令队列则确保命令按照顺序依次执行在执行一个命令的过程中不会插入其他命令从而保证了原子性。
订单系统相关
在订单每天都是百万级别的数据量且超过30分钟未支付系统自动取消订单的场景下如何设计把订单的状态改为取消 可以使用Redis的有序集合以订单创建时间加上30分钟作为score订单ID作为member。定时任务定期扫描有序集合取出当前时间超过score的订单ID去数据库中更新订单状态为取消。也可以使用消息队列延迟消息功能在订单创建时发送一个30分钟后的延迟消息消息到达时更新订单状态。 订单系统中MQ的具体使用场景是什么 订单创建后发送消息到MQ通知库存系统扣减库存。通知支付系统进行支付处理。订单状态变更时通知相关系统更新状态如通知物流系统订单已支付待发货等。实现异步解耦提高系统的稳定性和性能。 如何保证MQ消息的幂等 在消息中添加唯一标识消费者在处理消息前先检查是否已处理过该标识的消息。利用数据库的唯一索引对消息中的关键信息建唯一索引插入时若冲突则表示重复消息不做处理。使用状态机记录消息处理的状态根据状态决定是否处理消息。
RocketMQ相关
rocket mq是如何保证消息不丢失的有没有做过相关设置 生产者发送消息时采用同步发送方式并设置合理的重试次数。Broker配置刷盘策略为同步刷盘保证消息及时持久化到磁盘。消费者采用手动提交偏移量处理完消息后再提交防止消费过程中丢失消息。设置相关参数如unflushDelayMills控制刷盘时机等。
微服务相关
微服务拆分的原则是什么 单一职责原则每个微服务只负责一项主要功能。高内聚低耦合微服务内部功能紧密相关微服务之间耦合度低。业务边界清晰按业务模块进行拆分。可扩展性原则便于独立扩展和维护。数据独立每个微服务有自己独立的数据库或数据存储。 微服务中分布式事务的具体解决的方案是什么采用的Seata是用的哪种模式其执行过程是什么这种模式下的隔离级别和MYSQL的隔离级别有什么不一样会不会有什么问题如何解决 解决方案有两阶段提交、TCC、本地消息表、Seata等。Seata模式以AT模式为例执行过程是开启全局事务业务操作时Seata拦截SQL记录数据的前后镜像提交时协调各分支事务提交若失败则根据镜像回滚。隔离级别差异Seata AT模式默认读未提交MySQL默认可重复读。Seata可能存在脏读问题。问题及解决可通过在业务层控制事务边界结合MySQL的锁机制等必要时提高Seata隔离级别来解决。
数据库相关
公司的SQL语句规范是什么表在建立索引的时候有什么原则 SQL规范命名规范表名、字段名等要有意义且遵循统一格式。语句格式化缩进、换行规范。避免使用SELECT *明确列出所需字段。合理使用事务等。索引原则在经常用于查询条件、连接条件、排序和分组的字段上建立索引。区分度高的字段优先建索引。避免过多索引考虑索引的维护成本。联合索引遵循最左前缀原则。 23. 为什么不建议用 uuid 作为 MYSQL 的主键索引
存储开销大UUID 是 128 位通常以 36 个字符的字符串形式存储相比自增整数如 INT 型 4 字节占用更多存储空间增加了索引文件大小。性能影响 插入性能UUID 无序插入时会导致数据页频繁分裂影响插入效率。而自增主键按顺序插入数据页分裂频率低。查询性能范围查询时自增主键更具优势因为其值连续利于快速定位数据范围UUID 无序无法利用范围查询优化。
24. select 语句的查询过程是什么如何预防回表
查询过程 解析与预处理MySQL 解析 SQL 语句检查语法生成解析树并进行预处理如权限检查、表名和列名解析。优化器分析查询语句考虑多种执行方案如索引使用、表连接顺序等基于成本模型选择最优执行计划。执行器按照执行计划调用存储引擎 API获取数据并返回给客户端。 预防回表 覆盖索引查询列包含在索引中避免回表操作。例如查询 SELECT col1, col2 FROM table WHERE col3 value若建立 (col3, col1, col2) 复合索引可利用覆盖索引直接获取结果。减少不必要查询列仅查询索引列可避免回表。
25. 在线上给一个小表加了个字段结果导致整个库都挂了原因是什么如何解决
原因 锁表问题在添加字段操作时MySQL 可能会使用表锁长时间占用表资源导致其他读写操作被阻塞若有大量并发请求可能拖垮整个数据库。磁盘空间不足添加字段可能导致表结构变更需要额外磁盘空间。若磁盘空间已满操作失败并可能影响数据库其他功能。 解决方法 在线 DDL 工具使用工具如 pt-online-schema-change 或 gh-ost它们通过创建临时表、复制数据等方式实现无锁或低锁的表结构变更。提前检查磁盘空间在操作前确保有足够磁盘空间。
26. MYSQL 中是如何出现死锁的在设计表的时候如何减少锁的冲突
死锁产生原因两个或多个事务在获取资源时互相等待对方释放已占有的资源形成循环等待导致死锁。例如事务 A 持有锁 L1 并请求锁 L2事务 B 持有锁 L2 并请求锁 L1。减少锁冲突的表设计方法 合理设计索引确保经常用于查询条件的字段有索引减少全表扫描降低锁的粒度和时间。优化事务顺序按照固定顺序访问资源避免循环等待。例如所有事务都先访问表 A 再访问表 B。降低事务隔离级别在满足业务需求前提下适当降低事务隔离级别减少锁的持有时间。
27. 单点登录系统是用什么协议来实现的如何解决 token 或 session 的跨域问题
常用协议 CASCentral Authentication Service简单的单点登录协议客户端通过 CAS 服务器认证服务器返回票据客户端凭票据访问其他应用。OAuth开放授权用于授权第三方应用访问用户资源用户在授权服务器认证后第三方应用获取授权令牌访问资源。SAMLSecurity Assertion Markup Language基于 XML 的标准用于在不同安全域间交换认证和授权信息。 解决跨域问题 Token 跨域通过在响应头设置 Access - Control - Allow - Origin 允许跨域访问前端在请求时携带 Token。也可使用 JSONP 或 CORS 代理方式传递 Token。Session 跨域使用 JSONP 传递 Session ID或通过设置代理服务器在代理服务器上维护统一的 Session 存储实现跨域共享 Session。
28. 如何设计和实现微信扫码登录的功能
设计思路 前端展示扫码登录按钮调用微信提供的扫码登录接口显示二维码。后端接收微信服务器回调验证回调信息生成用户登录状态返回登录结果给前端。 实现步骤 注册应用在微信开放平台注册应用获取 AppID 和 AppSecret。前端生成二维码前端调用微信 JS - SDK 生成带有唯一标识如 state 参数的二维码展示给用户。用户扫码用户使用微信扫码微信服务器将扫码信息发送到后端服务器。后端验证后端接收微信回调使用 AppID 和 AppSecret 验证回调信息合法性获取用户信息。生成登录状态后端生成用户登录状态如 Token存储用户登录信息返回登录结果给前端。前端处理前端根据后端返回结果处理登录成功或失败逻辑。 在Redis集群中使用Lua锁
可能会存在以下一些问题
一致性问题
数据同步延迟Redis集群采用异步复制机制主节点将数据复制到从节点存在一定延迟。当使用Lua脚本获取锁时若主节点在未完成数据同步到从节点的情况下出现故障新的主节点可能没有锁的相关数据导致锁的一致性被破坏出现多个客户端同时获取到锁的情况。网络分区影响在网络分区场景下集群可能会被分割成多个子集群。若获取锁的客户端所在子集群与持有锁的主节点所在子集群隔离可能会导致客户端无法正确判断锁的状态出现误判获取锁成功的情况进而引发数据不一致等问题。
性能问题
脚本执行阻塞Redis是单线程处理命令Lua脚本在执行时会阻塞其他命令的执行。如果Lua锁脚本执行时间过长会影响Redis对其他请求的处理能力降低整个系统的性能和响应速度。集群资源消耗在集群环境中执行Lua脚本需要在多个节点之间协调和同步这会增加网络开销和节点的计算资源消耗。大量使用Lua锁可能导致集群资源紧张影响整体性能。
复杂性问题
脚本编写难度编写正确、高效且能在集群环境中稳定运行的Lua锁脚本具有一定难度。需要开发者对Redis集群的工作原理、数据一致性模型以及Lua脚本的特性有深入理解否则容易出现逻辑漏洞和错误。维护和调试困难由于Lua锁脚本在集群中的执行涉及多个节点和复杂的网络交互出现问题时定位和解决问题的难度较大。例如当锁出现异常释放或无法获取的情况时很难快速确定是脚本逻辑问题、网络问题还是节点故障等原因导致。
兼容性问题
版本差异不同版本的Redis对Lua脚本的支持可能存在差异某些特性或行为可能在不同版本中有所变化。在使用Lua锁时可能会因为Redis版本升级或集群中节点版本不一致等原因导致锁的行为不符合预期。与其他模块冲突如果Redis集群中还使用了其他模块或扩展可能会与Lua锁产生兼容性问题。例如某些模块可能会修改Redis的命令执行逻辑或数据结构影响Lua锁的正常工作。 如何处理Redis中大key
大key的检测
使用Redis命令可以使用MEMORY USAGE命令来获取键的内存占用情况从而找出大key。例如MEMORY USAGE key可以返回key的内存占用字节数。还可以结合SCAN命令遍历所有键对每个键执行MEMORY USAGE来全面检测大key。借助Redis工具利用redis-cli的--bigkeys选项它可以快速扫描并找出内存中占用空间较大的键。也可以使用Redis的可视化工具如RedisInsight、RedisDesktopManager等这些工具通常提供了直观的界面来展示键的大小和分布情况方便查找大key。
优化存储结构
对象编码优化Redis的不同数据类型有不同的编码方式例如hash类型如果字段较少且值较小使用ziplist编码会更节省空间。可以通过OBJECT ENCODING命令查看键的编码方式并考虑是否可以通过调整数据结构或使用合适的命令来优化编码。比如对于一个包含大量小字段的hash可以使用HMSET而不是逐个HSET来插入数据这样可能会使Redis采用更紧凑的编码。使用压缩对于值是字符串类型的大key如果内容可压缩可以在客户端对数据进行压缩后再存储到Redis中获取数据时再进行解压缩。可以使用gzip、zlib等压缩库来实现。不过要注意压缩和解压缩会带来一定的CPU开销需要根据实际情况权衡。
数据拆分
按数据特征拆分如果大key是一个hash或list等集合类型可以根据数据的业务特征将其拆分成多个小key。例如一个包含用户所有订单信息的大hash可以按照订单时间或订单类型等维度拆分成多个hash每个hash只包含部分订单信息。使用Redis集群将大key的数据分布到多个Redis节点上通过集群的方式来分散存储和访问压力。可以使用Redis的分片集群如Redis Cluster它会根据键的哈希值将数据分布到不同的节点上。在使用Redis Cluster时需要合理设计键的命名规则确保相关数据能够均匀分布在各个节点上。
过期策略和淘汰机制
设置合理过期时间对于一些时效性较强的大key设置合适的过期时间让Redis自动删除过期的大key以释放内存空间。比如缓存类的大key根据其业务场景设置几分钟到几小时不等的过期时间。调整淘汰策略根据业务需求调整Redis的内存淘汰策略。例如设置为volatile-lru对设置了过期时间的键采用LRU算法淘汰或allkeys-lru对所有键采用LRU算法淘汰让Redis在内存不足时优先淘汰不常用的大key。也可以结合maxmemory配置项合理设置Redis的最大内存使用量触发淘汰机制。