Java后端开发岗位面试经验总结:技术深度与实践能力的考验

面试经验分享

XXXX科技有限公司

(成都某小公司)

文章目录

  • 面试经验分享
    • XXXX科技有限公司
    • 笔试(100',60'及格)
        • 对List中的数据进行倒序排列() 10'
        • 缓存中常见的问题,怎么解决 10'
        • 用户登录模块流程设计,一级登录权限的设计,数据库表结构设计,登录流程,以及权限验证(对权限进行细分,每一个接口对应一个权限) 40'
        • 编写sql语句(具体略) 40'
    • 面试
        • 先做一个自我介绍。
        • 介绍一下你开发的项目。
        • 我看你用过OAuth2.0 能详细说说具体的底层实现吗?
      • 1. OAuth 2.0的基本概念
      • 2. 授权流程
      • 3. 授权码模式的底层实现细节
      • 4. 安全性考虑
      • 5. 示例代码(使用Spring Security OAuth2)
        • 我看你简历上写的熟悉Spring security,能简单讲讲底层原理吗?
        • 你用过主从复制吗?可以具体讲讲嘛。
        • 现在有一个用户登录的流程,我看你设计的这个模块,能讲一下具体实现的思路吗?
        • 你是怎么实现权限细分(每一个接口对应一个权限)的?
        • 你能讲讲用户登录的流程吗?
        • rbac知道吗?
        • 数据库表关联用的多吗?

笔试(100’,60’及格)

  1. 对List中的数据进行倒序排列() 10’
    public static void main(String[] args) {List<Integer> list = new ArrayList<>(Arrays.asList(6, 1, 2, 3, 4, 5));list.sort(Integer::compareTo);//对List进行排序Collections.reverse(list);System.out.println(list); // 输出: [6, 5, 4, 3, 2, 1]
    }
    
  2. 缓存中常见的问题,怎么解决 10’
    * 常见的缓存问题:
    * 1.缓存穿透:大量请求不存在的缓存数据,绕过缓存直接查询数据库,增加数据库压力
    *   对空结果也进行缓存,并设置较短的缓存时间。
    * 2.缓存雪崩:大量热点数据同时失效,造成数据库压力激增
    *   2.1、给缓存失效时间增加随机值,避免同时失效。
    *   2.2、使用多级缓存。
    *   2.3、设置热点数据永不过期。
    * 3.缓存击穿:热点缓存数据过期,造成大量访问数据库。
    *   3.1、设置热点数据永不过期
    *   3.2、使用互斥锁,使得只有一个线程查询数据库或更新缓存。
    * 4.数据不一致:缓存数据与数据库数据不一致
    *   先更新数据库、再删除或者更新缓存。
    * 5.缓存预热:启动系统时,缓存还无,大量数据访问系统
    

    缓存系统中常见的问题及其解决方案包括:

    1. 缓存穿透

    问题:大量请求查询不存在的数据,绕过缓存直接查询数据库。

    解决方案:

    • 对空结果进行缓存,设置较短的过期时间。
    • 使用布隆过滤器快速判断key是否存在。
    1. 缓存击穿

    问题:热点key过期时,大量并发请求直接访问数据库。

    解决方案:

    • 设置热点数据永不过期。
    • 使用互斥锁,保证只有一个线程去查询数据库和更新缓存。
    1. 缓存雪崩

    问题:大量缓存同时失效,造成数据库压力骤增。

    解决方案:

    • 给缓存失效时间添加随机值,避免同时失效。
    • 利用多级缓存。
    • 设置部分热点数据永不过期。
    1. 数据一致性

    问题:缓存与数据库的数据不一致。

    解决方案:

    • 先更新数据库,再删除缓存。
    • 使用消息队列确保数据最终一致性。
    1. 缓存预热

    问题:系统启动时缓存为空,可能会承受大量数据库请求。

    解决方案:

    • 系统启动时主动加载热点数据到缓存。
    1. 缓存更新

    问题:如何确保缓存中的数据及时更新。

    解决方案:

    • 设置合理的过期时间。
    • 采用主动更新策略,在数据变更时更新缓存。
    1. 缓存并发问题

    问题:多线程环境下可能造成缓存数据不一致。

    解决方案:

    • 使用线程安全的缓存实现。
    • 采用适当的锁策略。
    1. 缓存容量管理

    问题:缓存容量有限,需要合理管理。

    解决方案:

    • 使用LRU、LFU等淘汰算法。
    • 根据业务重要性为不同数据设置不同的过期策略。
    1. 缓存穿透

    问题:恶意请求频繁查询不存在的数据。

    解决方案:

    • 对查询进行接口限流和熔断。
    • 定期清理无效缓存。

    通过合理应用这些解决方案,可以显著提高缓存系统的性能和可靠性。

  3. 用户登录模块流程设计,一级登录权限的设计,数据库表结构设计,登录流程,以及权限验证(对权限进行细分,每一个接口对应一个权限) 40’

    当然,我来为您简要概述这个用户登录和权限管理系统的整体设计:

    1. 数据库设计

      • 核心表: 用户表(users),角色表(roles),权限表(permissions)
      • 关联表: 用户角色关联表(user_roles), 角色权限关联表(role_permissions)
      • 辅助表: 登录历史(login_history), 密码重置(password_reset_tokens), 用户会话(user_sessions), 系统日志(system_logs)
    2. 登录流程

      • 用户提供用户名和密码
      • 后端验证凭据
      • 验证成功后生成JWT token
      • 更新最后登录时间并记录登录历史
      • 返回token给前端
    3. 权限管理

      • 基于RBAC(基于角色的访问控制)模型

      • 用户被分配角色,角色被赋予权限

      • 每个API接口对应特定权限

        当然,我会详细解释这两个重要的概念:为每个API接口分配特定权限,以及使用Spring Security进行权限验证。

        1. 每个API接口对应特定权限

        这个概念是实现细粒度权限控制的关键。我们为每个API接口定义一个或多个特定的权限,然后只允许拥有相应权限的用户访问该接口。

        实现步骤:

        a. 定义权限常量:

        public class Permissions {public static final String USER_READ = "USER_READ";public static final String USER_CREATE = "USER_CREATE";public static final String USER_UPDATE = "USER_UPDATE";public static final String USER_DELETE = "USER_DELETE";// ... 其他权限
        }
        

        b. 在控制器方法上使用注解来指定所需的权限:

        @RestController
        @RequestMapping("/api/users")
        public class UserController {@GetMapping@PreAuthorize("hasAuthority('" + Permissions

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/49725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“/usr/local/nginx/logs/nginx.pid“ failed (2: No such file or directory)问题

场景&#xff1a;在nginx启动状态下&#xff0c;执行命令 nginx -s stop 和 nginx -s reload都报错&#xff1a; [xxxBMP-TEST-001 sbin]$ nginx -s stop nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory) 报错的意…

Linux:Linux进程控制

目录 1. 进程概念 1.1 并行和并发 2. 进程创建 2.1 fork()函数初识 2.2 写时拷贝 2.3 fork常规用法 2.4 fork调用失败的原因 3. 进程终止 3.1 进程场景 3.2 进程常见退出方法 4. 进程等待 4.1 进程等待必要性 4.2 进程等待的方法 4.2.1 wait方法&#xff1a; 4.…

因子分析vs主成分分析

前两篇文章介绍了因子分析与主成分分析的原理与基本步骤。初次学习时&#xff0c;大家可能感觉这是两个基本相同的方法&#xff0c;但实际上两者间还是有一定差异的。这篇文章就带大家盘点一下两个方法间的异同。 目的 因子分析&#xff1a;旨在识别观测变量背后的潜在因素或结…

2024年起重信号司索工(建筑特殊工种)证模拟考试题库及起重信号司索工(建筑特殊工种)理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年起重信号司索工(建筑特殊工种)证模拟考试题库及起重信号司索工(建筑特殊工种)理论考试试题是由安全生产模拟考试一点通提供&#xff0c;起重信号司索工(建筑特殊工种)证模拟考试题库是根据起重信号司索工(建筑特…

C语言课程回顾:十二、C语言之 位运算

C语言之 位运算 12 位运算12.1 位运算符&#xff23;语言提供了六种位运算符&#xff1a;12.1.1 按位与运算12.1.2 按位或运算12.1.3 按位异或运算12.1.4 求反运算 12.2 位域&#xff08;位段&#xff09;12.3 位运算的实际应用12.4位运算注意事项1 二进制和位2 位运算符3常见位…

2.9.GoogLeNet

GoogLeNet ​ 主要解决了什么样大小的卷积核是最合适的&#xff1a;有时使用不同大小的卷积核组合是有利的 1.Inception块 ​ Inception块由四条并行路径组成。 前三条路径使用窗口大小为11、33和55的卷积层&#xff0c;从不同空间大小中提取信息。 ​ 中间的两条路径在输入…

谷粒商城实战-58-商品服务-API-三级分类-删除-批量删除小结

文章目录 一&#xff0c;增加一个批量删除的按钮并绑定事件二&#xff0c;全栈工程师三&#xff0c;逆向工程在全栈开发中的应用提升效率的方式&#xff1a;使用案例&#xff1a; 这一节的主要内容是开发批量删除分类的功能。 一&#xff0c;增加一个批量删除的按钮并绑定事件 …

zh echarts样式

记录一下&#xff1a; 一个图的配置 在echarts官网demo界面 option {title: {text: },legend: {data: [xxx前, xxx后]},radar: {// shape: circle,name: {// 雷达图各类别名称文本颜色textStyle: {color: #000,fontSize: 16}},indicator: [{ name: 完整性, max: 1 },{ name:…

【无标题】shell脚本的基本命令+编写shell脚本

shell脚本 一.shell基础 1.shell概念 2.shell脚本 3.shell脚本编写注意事项 二.编写shell脚本 1.编写一个helloworld脚本&#xff0c;运行脚本 [rootshell ~]# vim helloworld.sh #!/bin/bash //声明 echo "hello world!" ls -lh /etc/ 运行脚本(四种方式)&…

图像处理 -- Sensor与ISP驱动之像素时钟获取的方法

像素时钟获取方法 像素时钟&#xff08;Pixel Clock&#xff0c;也称为 PCLK&#xff09;是摄像头 sensor 和 ISP 协调工作时的关键参数之一&#xff0c;决定了每个像素的传输速率。获取或计算像素时钟可以通过以下几种方法&#xff1a; 1. 数据手册 (Datasheet) 大多数摄像…

C语言字符函数与字符串函数超详解

文章目录 前言1. 字符分类函数2. 字符转换函数3. strlen3. 1 strlen 的使用3. 2 strlen 的模拟实现 4. strcpy4. 1 strcpy 的使用4. 2 strcpy 的模拟实现 5. strcat5. 1 strcat 的使用5. 2 strcat 的模拟实现 6. strcmp6. 1 strcmp 的使用6. 2 strcmp 的模拟实现 7. strncpy 函…

VI/VIM编辑器及三种模式

目录 1. 三种模式 2. 使用 VIM 3. i/ a/ o 进入输入模式 VI/VIM是 visual interface 的缩写是 Linux 中最经典的文本编辑器&#xff1b; VIM是 VI 的增强版本&#xff0c;兼容 VI 的所有指令&#xff0c;不仅能够编辑文本&#xff0c;还具有 shell 程序编辑的功能&#xff…

maven引入了jar包但在class文件里找不到jar包里的类

在工作当中遇到的这个问题&#xff0c;别人引入的jar包&#xff0c;我代码里报错 maven clean 和 maven install 都不管用 检查过了pom文件 检查了maven仓库路径下是否有这个cn.hutool的jar包 都没有找到问题 最终解决办法是手动引入 步骤一&#xff1a;点击左上角file->…

3.4-GRU

1网络结构 1.1与LSTM相比 LSTM里面有三个门&#xff0c;还有一个增加信息的tanh单元&#xff0c;参数量相较于RNN显著增加&#xff1b; 因此GRU在参数上比LSTM要少&#xff1b; 另外&#xff0c;LSTM 将必要信息记录在记忆单元中&#xff0c;并基于记忆单元的信息计算隐藏状…

MySQL数据库(基础篇)

&#x1f30f;个人博客主页&#xff1a;心.c 前言&#xff1a;今天讲解的是MySQL的详细知识点的&#xff0c;希望大家可以收货满满&#xff0c;话不多说&#xff0c;直接开始搞&#xff01; &#x1f525;&#x1f525;&#x1f525;文章专题&#xff1a;MySQL &#x1f63d;感…

1.c#(winform)编程环境安装

目录 安装vs创建应用帮助查看器安装与使用&#xff08; msdn&#xff09; 安装vs 安装什么版本看个人心情&#xff0c;或者公司开发需求需要 而本栏全程使用vs2022进行开发c#&#xff0c;着重讲解winform桌面应用开发 使用***.net framework***开发 那先去官网安装企业版的vs…

Python可重入锁RLock的使用

Python可重入锁RLock的使用 在Python中,RLock(即可重入锁)是一种特殊类型的锁,它允许一个线程多次请求同一把锁,而不会造成死锁。这在某些复杂的多线程程序中非常有用,特别是当线程在执行一个函数时需要调用另一个需要相同锁的函数时。 使用 RLock 的基本方法 导入 RLo…

AI绘画入门实践 | Midjourney:使用 --chaos 给图像风格来点惊喜

在 Midjourney 中&#xff0c;--chaos 影响初始图像网格的多样性&#xff0c;指 MJ 每次出的4张图之间的差异性。 默认值为0&#xff0c;值越高&#xff0c;差异性越大。 使用格式&#xff1a;--chaos 0-100的整数值 使用演示 a lot of flowers --chaos 0 --v 6.0a lot of fl…

SSAN代码解析

文章目录 run_docred.py详细介绍每一行代码 dataset.py详细介绍每一行代码输入和输出示例 docred_convert_examples_to_features详细介绍每一行代码 DocREDProcessor详细介绍每一行代码输入和输出 run_docred.py 下面是带有详细中文注释的代码说明&#xff0c;包括输入和输出的…

项目打包与运行

前端运行时必须有与后端相同的数据库版本&#xff0c;数据库账号密码 右侧maven -> 展开要打包的项目 -> 生命周期 -> 双击package 打包好之后在target目录下 右键打开 在资源目录下输入cmd&#xff0c;执行以下命令即可运行&#xff08;端口号为yml文件…