12月25日GM金融面试汇总

分布式架构:
  • Sentinel
  • 分布式事务
MySQL:
  • Mysql的存储引擎,以及区别?
  • Mysql的索引分类,索引实现原理?
MQ
  • MQ的集群架构?
  • MQ 的消费端消费消息的过程?
  • MQ是如何确定哪个消费者消费哪些queue ?
  • 消费失败的信息在mq的位置发生变化吗?
  • MQ消息消费失败的消息是如何进入私信队列的?
基础
  • 线程池的创建过程和核心参数?
  • 创建核心线程数是什么时候创建的?是创建线程池的时候就创建的?还是使用的时候才创建?
  • 线程池中多余的线程如何销毁?(队列满了之后新增到了最大线程数)
  • 线程池在什么业务中使用?
  • ThreadLocal工作原理,数据如何在两个线程中传递?
Dubbo
  • Dubbo的服务发布过程服务 ,服务消费过程?
  • Dubbo的SPI和JDK的SPI区别?
  • Dubbo的元数据信息存储位置?
算法
  • LRU算法
  • 链表反转

MySQL

Mysql的存储引擎,以及区别?

存储引擎是存储数据、建立索引、更新/查询数据等技术的实现方式。

存储引擎是基于表的,而不是 基于库的,所以存储引擎也可被称为表类型。

比较重要的三种存储引擎: InnoDB 、MyIASM 、Memory

其中 InnoDB 是Mysql 默认的存储引擎,支持事务、行级锁、外键等高级功能。

MyIASM 不支持事务、不支持行级锁,只有表锁,适用于读写比较低的应用;

Memory 把数据存储在内存中,读写速度极快,但是容易出现数据丢失,另外要求存储的数据长度不变的格式,则Blob和text类型不可用。

算法
  • LRU算法
package org.example.牛客.面试榜单NC;

import java.util.HashMap;
import java.util.Map;

/**
 * NC93 设计LRU缓存结构
 * https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84?tpId=117&rp=1&ru=%2Fexam%2Foj&qru=%2Fexam%2Foj&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D117&difficulty=&judgeStatus=&tags=&title=&gioEnter=menu
 */
public class LRUCache {

    int capacity ;

    int size ;

    Map<Integer,ListNode> cache ;

    ListNode head ;

    ListNode tail ;

    public LRUCache(int capacity) {
        this.capacity = capacity ;
        this.size = 0 ;
        cache = new HashMap<>();
        head = new ListNode();
        tail = new ListNode();
        head.next = tail ;
        tail.pre = head ;
    }

    public int get(int key){
        ListNode node = cache.get(key);
        if(node!= null){
            removeToHead(node);
            return node.value;
        }
        return -1 ;
    }

    private void removeToHead(ListNode node) {
        // 删除节点
        removeNode(node);
        // 头结点新增节点
        addToHead(node);
    }

    private void removeNode(ListNode node) {
        // head >> 1 >> 2 >> 3
        ListNode pre = node.pre;
        pre.next = node.next ;
        node.next.pre = pre ;
    }

    private void addToHead(ListNode node) {
        // head >> 2 >> 3  head >> 1 >> 2 >> 3
        ListNode next = head.next;
        head.next = node ;
        node.pre = head ;
        node.next = next ;
        next.pre = node ;
    }
    private ListNode removeLastNode() {
        // head >> 2 >> 3 >> tail
        ListNode delNode = tail.pre;
        removeNode(delNode);
        return delNode ;
    }

    public void set(int key ,int value){
        ListNode node = cache.get(key);
        if(node == null){
            ListNode newHead = new ListNode(key,value);
            cache.put(key,newHead);
            size++ ;
            addToHead(newHead);
            if(size> capacity){
                //移除最后的元素
                ListNode dNode = removeLastNode();
                cache.remove(dNode.key);
                size-- ;
            }
        }else {
            node.value = value ;
            cache.put(key,node);
            removeToHead(node);
        }
    }



    class ListNode{
        int key ;
        int value ;

        ListNode next ;

        ListNode pre ;

        public ListNode() {
        }

        public ListNode(int key, int value) {
            this.key = key;
            this.value = value;
        }
    }
}
  • 链表反转
  •   public ListNode ReverseList (ListNode head) {
            // 使用栈来解决
            if(head == null || head.next==null){
                return head ;
            }
            Stack<ListNode> st = new Stack<>();
            while (head!=null){
                st.add(head);
                head = head.next;
            }
            ListNode res = st.pop();
            ListNode cur = res ;
            while(!st.isEmpty()){
                cur.next = st.pop();
                cur = cur.next;
            }
            cur.next = null ;
            return res ;
        }
    
        class ListNode {
            int val;
            ListNode next = null;
            public ListNode(int val) {
                this.val = val;
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值