架构设计&分布式&数据结构与算法面试题

架构设计

请列举出在JDK中几个常用的设计模式?

在这里插入图片描述

什么是设计模式?你是否在你的代码里面使用过任何设计模式?

在这里插入图片描述

静态代理、JDK动态代理以及CGLIB动态代理

在这里插入图片描述

静态代理

在这里插入图片描述

动态代理

在这里插入图片描述

cglib代理

在这里插入图片描述

单例模式

在这里插入图片描述

工厂模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

观察者模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

装饰器模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

秒杀系统设计

在这里插入图片描述

分布式

分布式概述

分布式

在这里插入图片描述

集群

微服务

在这里插入图片描述

多线程

在这里插入图片描述

高并发

在这里插入图片描述

分布式系统设计理念

分布式系统的目标与要素

在这里插入图片描述

分布式系统设计两大思路:中心化和去中心化

在这里插入图片描述
在这里插入图片描述

分布式与集群的区别是什么?

在这里插入图片描述

CAP定理

在这里插入图片描述

CAP定理的证明

在这里插入图片描述

BASE理论

在这里插入图片描述

BASE理论的核心思想

在这里插入图片描述

BASE理论三要素

在这里插入图片描述

1. 基本可用

在这里插入图片描述

2. 软状态

在这里插入图片描述

3. 最终一致性

在这里插入图片描述

数据结构与算法

冒泡排序(最高位确认最大)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

选择排序(最低位选最小)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

快速排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

递归

在这里插入图片描述

二分查找

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一致性Hash算法

概述

在这里插入图片描述

一致性Hash算法原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Java代码实现

public class ConsistentHash<T> {

    /**
     * 节点的复制因子,实际节点个数 * numberOfReplicas = 虚拟节点个数
     */
    private final int numberOfReplicas;
    /**
     * 存储虚拟节点的hash值到真实节点的映射
     */
    private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();

    public ConsistentHash(int numberOfReplicas, Collection<T> nodes) {
        this.numberOfReplicas = numberOfReplicas;
        for (T node : nodes) {
            add(node);
        }
    }

    public void add(T node) {
        for (int i = 0; i < numberOfReplicas; i++) {
            // 对于一个实际机器节点 node, 对应 numberOfReplicas 个虚拟节点
            /*
             * 不同的虚拟节点(i不同)有不同的hash值,但都对应同一个实际机器node
             * 虚拟node一般是均衡分布在环上的,数据存储在顺时针方向的虚拟node上
             */
            String nodestr = node.toString() + i;
            int hashcode = nodestr.hashCode();
            System.out.println("hashcode:" + hashcode);
            circle.put(hashcode, node);

        }
    }

    public void remove(T node) {
        for (int i = 0; i < numberOfReplicas; i++) {
            circle.remove((node.toString() + i).hashCode());
        }
    }


    /**
     * 获得一个最近的顺时针节点,根据给定的key 取Hash
     * 然后再取得顺时针方向上最近的一个虚拟节点对应的实际节点
     * 再从实际节点中取得 数据
     *
     * @param key
     * @return
     */
    public T get(Object key) {
        if (circle.isEmpty()) {
            return null;
        }
        // node 用String来表示,获得node在哈希环中的hashCode
        int hash = key.hashCode();
        System.out.println("hashcode----->:" + hash);
        //数据映射在两台虚拟机器所在环之间,就需要按顺时针方向寻找机器
        if (!circle.containsKey(hash)) {
            SortedMap<Integer, T> tailMap = circle.tailMap(hash);
            hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
        }
        return circle.get(hash);
    }

    public long getSize() {
        return circle.size();
    }

    /**
     * 查看表示整个哈希环中各个虚拟节点位置
     */
    public void testBalance() {
        //获得TreeMap中所有的Key
        Set<Integer> sets = circle.keySet();
        //将获得的Key集合排序
        SortedSet<Integer> sortedSets = new TreeSet<Integer>(sets);
        for (Integer hashCode : sortedSets) {
            System.out.println(hashCode);
        }

        System.out.println("----each location 's distance are follows: ----");
        /*
         * 查看相邻两个hashCode的差值
         */
        Iterator<Integer> it = sortedSets.iterator();
        Iterator<Integer> it2 = sortedSets.iterator();
        if (it2.hasNext()) {
            it2.next();
        }
        long keyPre, keyAfter;
        while (it.hasNext() && it2.hasNext()) {
            keyPre = it.next();
            keyAfter = it2.next();
            System.out.println(keyAfter - keyPre);
        }
    }

    public static void main(String[] args) {
        Set<String> nodes = new HashSet<String>();
        nodes.add("A");
        nodes.add("B");
        nodes.add("C");

        ConsistentHash<String> consistentHash = new ConsistentHash<String>(2, nodes);
        consistentHash.add("D");

        System.out.println("hash circle size: " + consistentHash.getSize());
        System.out.println("location of each node are follows: ");
        consistentHash.testBalance();

        String node = consistentHash.get("apple");
        System.out.println("node----------->:" + node);
    }

}

转载链接:https://blog.csdn.net/ThinkWon/article/details/105870730

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值