一面

简单进行一下自我介绍

项目问题 (项目问题因人而异, 没有具体的答案, 记录用于自己反思)

  • 数据之间的关联和定义是怎样的
  • 说到了Java化,举一个例子你是怎么进行Java化的
  • 系统边界如何定义的
  • 后台的数据展示的时候如何打平展示
  • Redis 在项目中的应用场景
  • 现在你有一批数据要对外交互, 应该如何进行加密?
  • 有什么让你觉得压力特别大的项目吗
  • 一个接口特别慢时的排查?

覆盖索引有了解过吗

  • 只需要在一棵索引树上就能获取SQL所需的所有查询输出, 无需回表, 速度更快
  • 为了实现联合索引, 可以把需要查询的字段, 建立到联合索引里面去(不要无意义的添加, 应该是作为筛选条件添加)
  • select count(id) 和 select count(*), 由于id不需要回表, 所以速度相对要快一些

为什么是最左匹配原则

  • 基于b+树,从左往右拼接字段,只能产生最左匹配这个结果

Redis为什么快

  1. 因为基于内存的调用

  2. 高效的数据结构
    Redis_data

    • SDS动态字符串:空间提前分配 + 空间惰性释放
    • quickList 快表:新版本中替代 zipList 和 linkedList, 利用LinkedList的双向链表, 存储zipList的头结点
    • skipList 跳表

操作系统的 "信号" 有什么了解吗

  • 信号是进程之间通信的一种方式,发送方发送内容,指定接收进程,然后发出软件中断,OS接到中断请求后,找到接收进程,通知接收进程处理信号

kill 和 kill -9 有什么区别?

kill和kill -9都用于终止进程, 区别在于:

  • kill生成一个结束进程信号, 要求接收进程释放内存或处理对应的子进程
  • kill -9 生成一个用户终止进程执行信号, 接收到信号的进程会立即终止进程

具体题目忘记了, 主要是awk在过滤文件内容时的应用

Redis的淘汰策略有了解吗

  • 基础两种
    • 默认: 定期删除, 但是每秒10次的扫描, 对于大容量存储的Redis来讲会造成巨大的复旦
    • 惰性删除: 访问key时, 如果过期会直接进行删除
  • 淘汰策略
    • noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键
    • allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键
    • volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键
    • allkeys-random:加入键的时候如果过限,从所有key随机删除
    • volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐
    • volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键
    • volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键
    • allkeys-lfu:从所有键中驱逐使用频率最少的键

说说LRU

LRU (Least recently used) 最近最少使用

  1. 新增k-v的时候, 首先在链表结尾添加节点, 如果设置超过阈值就淘汰头结点
  2. 修改k-v值时, 先修改, 再挪到队尾
  3. 访问k-v的时候, 移动Node到队尾

自己实现LRU的话怎么实现(其实是问LRU的实现原理)

  • 散列表(hashTable) 存储节点位置信息, 做到提升获取速率
  • 双向链表存储节点顺序
  • 头尾增加哨兵节点, 增加删除节点的时候直接删除