1.Algorithm:https://leetcode-cn.com/problems/implement-trie-prefix-tree/

实现trie

class TrieNode {
    private static final int R = 26;
    private TrieNode[] links;
    private boolean isEnd;

    TrieNode() {
        links = new TrieNode[R];
    }

    public boolean containKey(char ch) {
        return links[ch - 'a'] != null;
    }

    public TrieNode get(char ch) {
        return links[ch - 'a'];
    }

    public void set(char ch, TrieNode node) {
        links[ch - 'a'] = node;

    }

    public void setEnd() {
        isEnd = true;
    }

    public boolean isEnd() {
        return isEnd;
    }
}

public class Trie {
    /**
     * Initialize your data structure here.
     */
    private TrieNode root;

    public Trie() {
        root = new TrieNode();
    }

    /**
     * Inserts a word into the trie.
     */
    public void insert(String word) {
        TrieNode node = root;
        for (int i = 0; i < word.length(); i++) {
            char ch = word.charAt(i);
            if (!node.containKey(ch)) {
                TrieNode newNode = new TrieNode();
                node.set(ch, newNode);
            }
            node = node.get(ch);

        }
        node.setEnd();

    }
    TrieNode searchNode(String word) {
        TrieNode node = root;
        for (int i = 0; i < word.length(); i++) {
            char ch = word.charAt(i);
            if (node.containKey(ch)) {
                node = node.get(ch);
            } else {
                return null;
            }
        }
        return node;
    }

    /**
     * Returns if the word is in the trie.
     */
    public boolean search(String word) {
        TrieNode node =  searchNode(word);
        return node!=null && node.isEnd();
    }

    /**
     * Returns if there is any word in the trie that starts with the given prefix.
     */
    public boolean startsWith(String prefix) {

        TrieNode node =  searchNode(prefix);
        return node!=null ;
    }


}

2.Review:https://dzone.com/articles/understanding-reactor-pattern-thread-based-and-eve

假期重温一下reactor方面的一些基础知识,这一篇算是基础入门的东西

基于线程的架构 Thread-Based Architecture

thread-per-connection 每个连接请求一个线程,为了避免线程创建和销毁的开销,可以使用一个单独的分发线程接收请求,把请求放在一个有界阻塞队列里,后面通过线程池来消费队列里的请求。请求数量超过队列的长度会被丢弃。但是总有一些一对一的线程和连接的情况,比如Keep-Alive的连接,还有比如系统访问,网络连接等等。成百上千的线程也占据了大量的内存栈空间资源。

事件驱动架构 Event-Driven Architecture

事件驱动架构分离了连接和线程,用事件线程来处理指定的回调和处理函数。事件驱动架构包括事件生产者和事件消费者,生产者产生事件,只知道事件已经发生,消费者是知道事件发生的实体。它们可以处理事件或者只是被事件影响。

Reactor模式 The Reactor Pattern

Reactor模式是事件驱动模式的应用,简单来说,它是使用单独线程的事件循环阻塞在资源请求事件上,把它们分发给对应的处理器和回调。

IO不需要阻塞,因为有不同的处理器和回调会注册在事件上,这些事件包括有新的连接,有数据可读,数据可写等等。在多核环境下,这些处理器/回调通常使用线程池。

Reactor模式通常包括两个主要组成部分:

  1. Reactor : reactor允许在独立线程上,主要作用是对不同的IO事件作出响应,把事件分发到不同的handler(处理器)上。
  2. Handlers:handler用来真正处理IO事件。

Reactor模式的目的

Reactor模式是一种设计模式,用来处理顺序的同步多路复用的事件。它从多个并发的客户端接收连接、请求、消息等,用事件处理器进行序列化的处理。

3.Tip:https://mp.weixin.qq.com/s/Dr4Z_jzZxdcMgtHHmuF4HA

springboot中优雅停机的几种方式,比较实用。实际生产环境一般都结合注册中心实施。

4.share:https://thurstonzk2008.com/2020/01/30/%e3%80%8a%e5%95%86%e4%b8%9a%e9%93%b6%e8%a1%8c%e5%88%86%e5%b8%83%e5%bc%8f%e6%9e%b6%e6%9e%84%e5%ae%9e%e8%b7%b5%e3%80%8b%e7%ac%94%e8%ae%b0/