Java后端开发岗位面试经验总结:技术深度与实践能力的考验
面试经验分享
XXXX科技有限公司
(成都某小公司)
文章目录
笔试(100’,60’及格)
-
对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] }
-
缓存中常见的问题,怎么解决 10’
* 常见的缓存问题: * 1.缓存穿透:大量请求不存在的缓存数据,绕过缓存直接查询数据库,增加数据库压力 * 对空结果也进行缓存,并设置较短的缓存时间。 * 2.缓存雪崩:大量热点数据同时失效,造成数据库压力激增 * 2.1、给缓存失效时间增加随机值,避免同时失效。 * 2.2、使用多级缓存。 * 2.3、设置热点数据永不过期。 * 3.缓存击穿:热点缓存数据过期,造成大量访问数据库。 * 3.1、设置热点数据永不过期 * 3.2、使用互斥锁,使得只有一个线程查询数据库或更新缓存。 * 4.数据不一致:缓存数据与数据库数据不一致 * 先更新数据库、再删除或者更新缓存。 * 5.缓存预热:启动系统时,缓存还无,大量数据访问系统
缓存系统中常见的问题及其解决方案包括:
- 缓存穿透
问题:大量请求查询不存在的数据,绕过缓存直接查询数据库。
解决方案:
- 对空结果进行缓存,设置较短的过期时间。
- 使用布隆过滤器快速判断key是否存在。
- 缓存击穿
问题:热点key过期时,大量并发请求直接访问数据库。
解决方案:
- 设置热点数据永不过期。
- 使用互斥锁,保证只有一个线程去查询数据库和更新缓存。
- 缓存雪崩
问题:大量缓存同时失效,造成数据库压力骤增。
解决方案:
- 给缓存失效时间添加随机值,避免同时失效。
- 利用多级缓存。
- 设置部分热点数据永不过期。
- 数据一致性
问题:缓存与数据库的数据不一致。
解决方案:
- 先更新数据库,再删除缓存。
- 使用消息队列确保数据最终一致性。
- 缓存预热
问题:系统启动时缓存为空,可能会承受大量数据库请求。
解决方案:
- 系统启动时主动加载热点数据到缓存。
- 缓存更新
问题:如何确保缓存中的数据及时更新。
解决方案:
- 设置合理的过期时间。
- 采用主动更新策略,在数据变更时更新缓存。
- 缓存并发问题
问题:多线程环境下可能造成缓存数据不一致。
解决方案:
- 使用线程安全的缓存实现。
- 采用适当的锁策略。
- 缓存容量管理
问题:缓存容量有限,需要合理管理。
解决方案:
- 使用LRU、LFU等淘汰算法。
- 根据业务重要性为不同数据设置不同的过期策略。
- 缓存穿透
问题:恶意请求频繁查询不存在的数据。
解决方案:
- 对查询进行接口限流和熔断。
- 定期清理无效缓存。
通过合理应用这些解决方案,可以显著提高缓存系统的性能和可靠性。
-
用户登录模块流程设计,一级登录权限的设计,数据库表结构设计,登录流程,以及权限验证(对权限进行细分,每一个接口对应一个权限) 40’
当然,我来为您简要概述这个用户登录和权限管理系统的整体设计:
-
数据库设计
- 核心表: 用户表(users),角色表(roles),权限表(permissions)
- 关联表: 用户角色关联表(user_roles), 角色权限关联表(role_permissions)
- 辅助表: 登录历史(login_history), 密码重置(password_reset_tokens), 用户会话(user_sessions), 系统日志(system_logs)
-
登录流程
- 用户提供用户名和密码
- 后端验证凭据
- 验证成功后生成JWT token
- 更新最后登录时间并记录登录历史
- 返回token给前端
-
权限管理
-
基于RBAC(基于角色的访问控制)模型
-
用户被分配角色,角色被赋予权限
-
每个API接口对应特定权限
当然,我会详细解释这两个重要的概念:为每个API接口分配特定权限,以及使用Spring Security进行权限验证。
- 每个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
-
-
原文地址:https://blog.csdn.net/m0_63144319/article/details/140641849
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!