20240801面经背诵

  1. MVCC和undolog?

    • MVCC:
      • 依赖3个主要组件:
        • 隐藏字段,trx_id和rollback_ptr
          • trx_id记录当前操作这行数据的事务id
          • rollback_ptr指向这行数据的上一个版本,依次连接,形成一个版本链
        • undolog
          • 记录着行数据的多个版本,依次相连
        • readView
          • readView定义了事务中能读取的数据的范围,包含几个字段
            • 最小活跃事务id(up_limit_id)
            • 最大活跃事务id(low_limit_id)
            • 创建者事务id(createor_trx_id)
            • 活跃事务列表(m_ids)
            • 规则:
              id < up_limit_id可见
              id >= low_limit_id不可见
              id = creator_trx_id可见
              id in m_ids不可见,未提交
    • undolog:
      • undolog里面存的是什么:
        • 数据旧值
        • 操作这条数据的事务id
        • 数据所在位置,表明,行号,页号
        • 操作类型,update还是insert
        • 元数据,锁信息,时间戳
  2. undolog什么时候存数据?

    • 在事务内部进行写操作的时候不断存数据
  3. undolog数据格式?

    • 事务id
    • 表id
    • 行号
    • 旧值
    • 操作类型
    • 锁信息,时间戳等
  4. 4种隔离级别?4种隔离级别怎么保证的,什么时候加锁,加的什么锁?

    • 4种隔离级别:
      • 读未提交
        • 不加锁
      • 读已提交
        • 加锁和MVCC
        • 加锁的话,修改操作上排它锁,直到事务回滚或者提交释放锁,读操作不上锁。
        • MVCC的话,每次读取数据都生成一个readView
      • 可重复读
        • 加锁和MVCC
        • 加锁,修改操作上排它锁,直到事务回滚或者提交释放锁,读操作不上锁
        • MVCC控制读操作,在事务中第一次读取时生成一个readView,以后都沿用
      • 串行化
        • 使用范围锁和MVCC防止幻读
        • 对修改的行上排它锁,对读取的行上范围锁,直到事务提交或回滚
        • 读取操作使用MVCC机制,在第一次读取时生成readView,之后沿用
  5. Redis实现延迟队列?

    • 使用redis的keyspace notification
      • 在redis配置文件中启用keyspace notification
      • 设置延迟任务时set key ttl value key就是延时任务名,value就是延迟任务的具体信息,可以作为延迟任务的参数
      • 利用redis的pub/sub机制
      • 在配置类中设置当前订阅的topic,同时指定处理消息的类和方法
      • 发送延时队列消息,只需要往对应的的topic中发送消息即可
  6. RabbitMQ实现延迟队列?

    • RabbitMQ的延时队列借助死信队列来实现,需要将一个业务队列绑定一个死信交换机,死信交换机绑定一个私信队列来实现
    • 使用的话,在配置类里设置好对应的队列,交换机绑定关系,以及队列与死信交换机的绑定关系
    • 只需要发送时将消息发送到业务队列,并设置ttl,当其在业务队列中未被消费,且达到ttl时,将会被转发到死信交换机,并路由到死信队列,延时任务的逻辑只需要监听这个死信交换机,利用@RabbitListener,里面写对应的队列名,完成延时队列的延时任务
    • 其相较于redis的一个最大的优势是,redis一个项目下只能监听一个topic,而rabbitmq可以监听多个死信队列对应多个延时任务
  7. Java中的八大原子操作?

    • AtomicInteger
    • AtomicLong
    • AtomicReference
    • AtomicBoolean
    • AtomicLongArray
    • AtomicReferenceArray
    • AtomicStampedReference
  8. Java中有序性实现?

    • 通过volatile关键字来实现,volatile通过内存屏障来实现指令有序性,禁用指令重排序。
    • 内存屏障包括读写屏障
    • 对于volatile修饰的变量,对于写操作,禁止其他上面的读写操作重排序到这个写操作后面
    • 对于读操作,禁止下面的读写操作重排序到这个读操作之前
    • 还有通过互斥锁来实现
      • 确保一段逻辑是原子性的,不会交替执行其他线程来对共享变量进行修改
    • 还可以通过join操作来实现
      • 底层实现就是让调用线程进入wait状态,等join的线程执行完后再去唤醒。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值