随笔记
threadlocal的正确用法
1.每次调用完后,调用remove方法进行清空
2.使用private static强引用类型,避免threadlocalmap的key为null的时候存在引用链,造成内存泄漏
(每个threadlocal对象内有一个threadlocalmap,key为threadlocal,value为其对象)
rabbitmq消息确认机制
1.生产者端:信道上开启确认模式,broker在接收到消息后会返回ack给生产者,生产者会进行应答接收,来
反馈是否接收到该信息,然后调用对应的handleack和handlenack来处理重发或者其他逻辑
2.消费者端:接收到消息后也会返回ack给borker,如果收到ack消息将剔除mq中的消息,如果由于消费者
断开或消息处理超时没有收到ack将会进行重新投递,可能会造成重复消费,需要保证接口幂等性
rabbitmq的死信队列和延时队列
当消息超时后会进入私信交换机绑定的死信队列,只需要在使用队列的时候指定其绑定的死信交换机
延时队列是在其基础上的用法,即设置ttl过期时间,可以设置在消息或者队列上,然后让消费者监听对应的
死信队列就可以实现延时队列
currentHashMap采用分段锁
数据结构:reentrantlock+segment+hashentery,一个segement中包含一个hashentery数组
元素查询采用二次hash,一次定位到segement,第二次hash定位到对应的链表
锁:segement继承了retranlock,锁定操作的segement,其他segement不受影响,数组扩容不会影
响segement,get方法无需加锁
@transactional注解
propagation来控制事务的传播行为,常用的是required(如果当前存在事务则加入,如果不存在则创建
)和required_new(新建一个事务,如果当前存在事务就将事务挂起)
事务失效:自调用没用使用代理对象,该类没有被spring容器管理,异常被吃掉,数据库引擎不支持事务
,注解的方法不是public
慢查询优化:
测试环境来查看sql耗时以及执行计划,一般为未命中索引导致,或者查询了大量不需要的列可以进行一定程
度的sql优化,执行计划看type字段一般是:system >constant>eq_ref>ref>orange>index>all
system:数据库中只有一条数据
constant:通过主键或者唯一索引命中一条数据直接返回
eq_ref:读取本表和关联表中的每行组合成一行返回
ref:普通索引可能命中多行
orange:常见于between和in中扫描了部分索引
index:扫描了全部索引
all:扫描全表
nginx做反向代理和负载均衡
upstream:默认为轮询,可设置权重,iphash,最少连接或响应时间最短来设置