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