volitile最简单的理解,无论谁拿值,都通过地址获取最新的值。构造函数半初始问题。dcl单例因为cpu指令乱序,应该加。具体实现是storeload,loadload,loadstore,storestore隔离墙。
epoll jdk bug,epoll 事件监听。select轮询。
多路复用器,通过事件监听模型,分发accept,recv等事件,内核实现主要有select,epoll,本质上还是同步非阻塞IO。多路复用对应Java的API主要是NIO包里的Selector实现。
布隆过滤器,hash然后取模转下标,不存在一定不存在,存在有可能不存在。
redis redlock 集群投票
k8s相关
pod 类似理解成一个docker进程
service 真正服务
deployment 真正部署的东西
nodeport 对外端口
clusterip + ingress 动态服务 和 容器级网关
dashborad 管理看板
mysql
索引最左选择
buffer区【先redo log ,后binlog】异步刷盘
b+树,平衡子节点链表树,链表方便做范围判断
log4j2 MDC 全链路日志方案
在gateway上 生成traceid 通过globalfilter 扔到httpheader里,后置服务在filter里完成 MDC环境设置,然后log4j2 pattern中打印出来对应的值即可
gateway jwt 通过filter解出token,做鉴权处理,解出之后的东西依旧扔到httpheader里,后置再获取使用即可
限流
spring gateway,nginx都可以实现
漏桶算法,其实就是队列,缓冲之后往下扔
令牌桶算法,维护一个令牌凭证,谁能获取到令牌,谁往下走。
nginx常用令牌桶实现。
Integer比较问题
Integer.valueOf 中,如果值在-128-127之间,则会返回IntegerCache的对象,IntegerCache是自动封箱的缓存处理
linux分析命令
strace -tt -f [logpath] program
strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。
ConcurrentHashMap
hash存储区分段锁synchronized,在计算下标,resize扩充时使用CAS乐观锁
CAS do-while模板代码:
AtomicInteger count = new AtomicInteger(0);
boolean flag;
do {
flag = count.compareAndSet(count.get(), count.get() + 1);
} while (!flag);
System.out.println(flag);
tcp
三次握手,syn,syn ack,ack
四次分手,fin,fin ack,fin,fin ack
七(五)层:
应用层(展示层,会话层)
控制链路层,这里tcp握手,控制网络管道状态
网络层,寻址
链路层,发包
物理层,真实电信号传输
HTTPS 加密
内容传输 -> 对称加密,
证书验证 -> 非对称加密,
client ---- hack ---- server
hack攻击需要伪造证书,才能对client构成欺骗。
当CA机构存在时,浏览器会使用CA.pub验证证书的合法性,用来保证S.pub的真实性。接下来client使用S.pub去和服务器协商对称的具体算法和salt。最终和服务器完成带salt对称加密通信。
spring循环依赖解决,前提是必须setter注入,构造函数依赖会直接抛出异常,spring使用三级缓存来解决setter循环依赖:
一级 实例化完,初始化完的对象
二级 实例化完,但没初始化的对象
三级 实例化完之后存放的对应对象,使用ObjectFactory在维持,确保包装工厂中放的是真正使用中的对象(有Proxy则返回Proxy,否则返回原先的对象),而使用ObjectFactory是因为getObject方法可以切换上下文,比如从线程中获取的HttpServletRequest对象
禁止快抛 -XX:-OmitStackTraceInFastThrow
锁:
偏向锁 → 轻量级锁(自旋锁) → 重量级锁
偏向锁(没竞争的时候)第一次 访问锁块时候,产生偏向锁,执行完代码块之后,偏向锁不会马上释放,下次循环进来获取锁的时候,效率很高
当产生竞争时,产生轻量级锁,竞争线程不挂起,而是自己和cpu玩(因为切换上下文代价大于自己玩一会),当自己玩的时间久了(超过10次),轻量级锁 → 重量级锁,之后所有竞争锁的人直接挂起自己。另外,可重入锁 其实就是 递归锁,指递归方法里可以重复获取
keepalived高可用方案
DNS轮询 不同的nginx机器,nginx机器上互相使用keepalived(提供虚拟ip,内部心跳配合checkscript做服务健康检查)实现高可用,当服务宕掉,keepalived发生ip漂移,最终达到HA