- 公司最新的业务,为什么有两个云平台
- 一个教学平台,一个比赛平台,然后说一些业务
- 搭建过权限架构,使用的是什么框架?是如何实现 Spring Security 的?Spring Security 是如何实现权限验证的?
- Spring Security,引入依赖,配置一个 Configure,开启 Security Method 验证,自定义实现 UserDetailsService,扩展 UserDetails,加载 Authority,默认存入 Session 中,可以将 Session 扩展到 Redis、MongoDB 等地方保存,即可加载出用户信息到 SecurityContext 中。
- 通过@PreAuthorize 可以验证之前加载的 Authority 权限数组。
- 如果用户保存在 Session 中,那么权限变更后如何重新加载权限?
- 现在的解决方案:SpringSecurity 是通过 @PreAuthorize 的 SecurityExpressionOperations 实现类,如 hasAuthority()、hasAnyAuthority(…) 来验证的,那么我们只要实现一个 hasCustomAuthority() 改为从 Redis、MongoDB 等地直接获取用户存储的权限即可。通过使用自定义的接口,扩展 Security 的验证
- 不用担心性能问题,因为我们的 Session 存储在 Redis、MongoDB 中,那么程序每次获取 Session 时,都会从 Redis、MongoDB 中取。那么自定义接口所修改的,只是从 spring_sessions 表改为了自己的用户权限表。
- JDK 版本是多少?1.8 有哪些新特性?说说你对流式编程的理解?如何从 List中取出所有的 username?
- jdk8 主要增加了对集合类的流式操作,也就是所说的 lambda 表达式,使我们对集合的遍历等操作更加便利。
- userList.stream().map(val -> val.getUsername()).collect(toList())
- 用过索引没?谈谈索引的作用?谈谈复合索引
- 索引的主要作用是优化查询,在数据库的某一个字段上创建了索引后,对该表的某一个字段查询时,将不再遍历整张表,而是遍历索引树。但是索引不应该创建的过多,如果索引树过于庞大的话,对性能也有很大的影响
- 复合索引,就是以一个数组的方式保存多个字段,然后在查询时,依次按照索引的位置从左到右查询
- 以下来自于“高性能 MySQL”中对索引设计的规范:
- 禁止给每个列都建立索引,单表索引建议不超过 5 个
- 索引定义在 SELECT、UPDATE、DELETE 语句的 WHERE 从句中的列
- 索引定义在 OrderBy、GroupBy、Distinct 中的字段
- 多表 Join 的字段
- 复合索引,区分度高的放左侧、字段长度小的放左侧、使用最频繁的放左侧
- 避免冗余索引和重复索引,MySQL 在执行优化时需要选择具体的索引,降低了索引使用效率
- 避免使用外键约束,建议在业务端保证数据的参照完整性,因为外键会影响父表和子表的写操作而降低性能
- 不建议使用外键约束,但一定要在表与表的关联键上建立索引
- 说一说数据库事务是什么?回滚是在什么情况下发生的(提示)?
- 我只说了数据隔离,然后被提示之后才想到一致性
- 数据隔离,比如数据插入时阻塞其他插入操作,数据查询时阻塞其他插入操作等,这些由数据库的事务隔离级别来决定(还好没问我数据库的隔离级别,越简单的越不容易记),避免脏读
- 回滚是为了保存数据的一致性,在同一个事务中执行的 SQL 会保持一致性,只能全部执行成功。如果某一个 SQL 出现了异常,会导致整个事务回滚到执行之前的状态。
- 什么是分布式锁?怎么实现分布式锁?
- 分布式锁就是为了解决集群环境时,JVM 和锁无法工作的问题。因为多台服务器的线程彼此之间没办法互相加锁,因此需要一些第三方中间件来帮助我们来模拟加锁行为。
- 比如 Redis、Zookeeper、MongoDB 等中间件,我们定义一个标识位,在我们进行一些对数据有要求的插入等操作时,为了避免其他线程同时执行,我们需要在执行之前尝试获取这个标志位,如果获取成功了,那么执行,获取失败则等待、轮询、或者抛出异常。
- Redis 是如何实现分布式锁的?
- Redis 有一个 setNX 的语句,是一个 CAS 操作,会先比较某一个值是否存在,如果不存在才设置,存在则不设置。
- setNX 比直接查询再赋值,要原子化,将查询并修改合为一个操作。查询再赋值的操作再怎么快也是有时间间隔的。
- Redis 有哪些数据结构?(对 Redis 不太熟悉,带过了)
- string、hash、list、set、sorted set(后续查的)
- 公司是如何使用 Docker 的?Docker 是如何创建镜像的?
- (白话)公司将 Nginx、后台的 Java Jar、前端编译后的包,都挂载到 docker 上,并使用容器的方式启动和运行。使用 Docker 能够保证每次容器运行时的环境都是隔离的。使用方法:在项目根目录下写一个 Dockerfile,然后在文件中指定所需的 jdk 版本、redis 等其他中间件服务。(后面这段没回答上来)然后通过 docker build 的方法生成镜像,然后将镜像通过 docker push 的方式推送到远程云上。push 之后我就不知道了。这些是从公司的 jenkins 上学到的。
- 你有什么要了解的吗?
- 打脸行为:
- 问:技术栈听贴合的,那么公司用的什么 ORM 框架呢?答:Mybatis,你用的是 JPA?
- 就这吧,嘟嘟嘟……
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 凯!