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模式通常包括两个主要组成部分:
- Reactor : reactor允许在独立线程上,主要作用是对不同的IO事件作出响应,把事件分发到不同的handler(处理器)上。
- Handlers:handler用来真正处理IO事件。
Reactor模式的目的
Reactor模式是一种设计模式,用来处理顺序的同步多路复用的事件。它从多个并发的客户端接收连接、请求、消息等,用事件处理器进行序列化的处理。
3.Tip:https://mp.weixin.qq.com/s/Dr4Z_jzZxdcMgtHHmuF4HA
springboot中优雅停机的几种方式,比较实用。实际生产环境一般都结合注册中心实施。