SSE:服务端推送协议
区块链:
疑问:POS只是有币龄利息,但是获得区块是否还是要通过POW共识来得到呢?DPOS是否是缩小挖矿机器的范围?
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
多线程:
一般用runnable而不是直接用thread,因为thread只能用继承,runnable是接口;
如果直接调用thread的run接口,多个线程之间是顺序执行没有交替,要用start方法才可以;
其次是Thread(Runnable targer)此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程;
多线程核心的方法:jion()等待其他线程执行完;wait/notify围绕锁来等待和唤醒,锁分为对象锁(即一个对象实例加锁)和类锁(一个类定义文件CLASS对象的加锁)
hadoop:
hadoop主要分为分布式存储hbase和分布式计算框架两部分,hbase主要量大的、存储不变的信息如日志,计算式框架有mapreduce(适合离线计算),stom(适合在线实时计算)、spark等,其中流动计算而非流动数据思想卓越。
JVM相关:
JVM内存分为堆和栈,栈主要是线程级别的内存,在调用方法时动态分配,先进后出,存方法调用时的局部变量为主;堆中的方法区存放基本不变的信息,如类定义、常量、静态变量等,极少被回收,除非动态加载(CGLIB)用得比较多;其他在程序中新NEW的对象都放在堆中,分成新生代、中年代、老年代等。
垃圾回收一般采用标记-复制方法,新生代回收次数最多
消息中间件:
消息中间件的应用场景有异步处理,应用解耦,流量削锋和消息通讯四个场景
AMQP:支持长周期消息、支持分布式事务
redis:
redis也支持分布和主从结构,即数据会根据HASH结果存到不同的节点上,每个节点又有主从结构;
redis支持事务,开启事务--传入命令集--提交事务,可以保证命令集被原子性执行或不执行,但是命令集中某条命令执行错误并不会阻止其他命令的执行,会返回给客户端某条命令的错误信息;
支持内存回收,如果配置了memory参数,超过时会按指定的加收策略回收内存,如不常用的KEY等;
持久化:
RDB快照是每隔一段时间将整个内存数据写入磁盘,如果数据量大的话,必然会引起大量的磁盘io操作,可能会严重影响性能。另外由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。
aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中
重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以
通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机。有三种方式如下(默认是:每秒fsync一次)
RPC REST区别适用场景:
RPC是基于TCP的专门用作远程函数调用的协议,系统之间通讯建议用RPC;而REST是基于资源的服务概念,开放平台或对外的服务建议用REST,协议的通用性会好一些。
hiberate:
自动生成SQL;面向对象编程;不适合指操作和复杂SQL的场景;有一级(线程级)二级(进程级)缓存;延时加载(用到时才执行SQL)可以提高性能;
mybatis:
可以手动写SQL,主要工作量在于resultmap和表字段的映射;也有一级二级缓存,缓存在数据有更新的时候会自动清空,前提是更新也是通过mybatis的接口完成的
设计模式:
future模式:客户端调用立即返回伪数据,即一个数据对象但不包含实际的数据,再启动一个线程去取真实的数据再填充到之前返回的数据对象中,节约客户等待的时间;这种场景用在请求数据和真正使用数据中间有其他的业务处理,利用处理其他业务的时间用另一个线程去取真实的数据,等其他业务处理完数据也取到了,真正使用数据时也有了。
NIO:
阻塞IO是多个连接由多个线程处理,而非阻塞IO是由一个线程轮询注册的事件有没有发生,比如服务器端监听有没有客户端连接事件、有没有消息发送过来的事件、客户端监听有没有连上服务端的事件等。服务端和客户端都各自启一个线程专门监听,这个线程可以监听多个通道(我理解的是多个端口)。阻塞IO是单向通道,NIO是双向通道。
DUBBO:
伪造返回结果,可在失败时执行,或直接执行,用于服务降级;
对每个集群调用时,集群自身要处理跟帖(如读写分离)、负载均衡、容错处理(调用失败后的策略);
NGINX:
可以解决跨域请求问题;配置时proxy_pass路径后面带上/,否则会把请求匹配路径也加到后面;