当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CSS(二)——CSS 背景
  • 【C++】:AVL树的深度解析及其实现
  • 【YashanDB知识库】filter or改写问题
  • EXO项目解析:pynvml怎么实现监控的,包括什么参数
  • 怎么服务器组内网?
  • 【BES2500x系列 -- RTX5操作系统】系统启动流程 -- boot loader概念讲解 --(九)
  • GO内存分配详解
  • Python 使用TCP\UDP协议创建一个聊天室
  • 四、Object 通⽤⽅法
  • es master 节点数据丢失导致数据节点加入集群失败的灾难恢复
  • C# 之工控机数据类型 高低位(大小端)、BitConverter、IsLittleEndian、字节数组转换(高低位)
  • Redis 主从复制、哨兵机制关键参数与命令
  • Spring Boot + Spring Cloud 入门
  • java模拟多ip请求【搬代码】
  • 基于STM32的农业大棚温湿度采集控制系统的设计
  • JS 中的深拷贝与浅拷贝
  • [deviceone开发]-do_Webview的基本示例
  • [笔记] php常见简单功能及函数
  • [译]CSS 居中(Center)方法大合集
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Python爬虫--- 1.3 BS4库的解析器
  • 构建工具 - 收藏集 - 掘金
  • 基于组件的设计工作流与界面抽象
  • 每天10道Java面试题,跟我走,offer有!
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端技术周刊 2019-01-14:客户端存储
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 使用agvtool更改app version/build
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • # 透过事物看本质的能力怎么培养?
  • #Z0458. 树的中心2
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (1)bark-ml
  • (20050108)又读《平凡的世界》
  • (39)STM32——FLASH闪存
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原)本想说脏话,奈何已放下
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET Core 中的路径问题
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .net6 webapi log4net完整配置使用流程
  • .Net--CLS,CTS,CLI,BCL,FCL
  • .net打印*三角形