Leetcode
148. 排序链表
归并排序 :适合链表的排序
先用快慢指针找到中间节点 然后分为左右两个链表 在合并时排序
102. 二叉树的层序遍历
Queue<TreeNode> queue = new LinkedList<>();
1.普通队列创建方式
2.null也会被加入队列 所以要先进行判断再加入
3.queue.size()会动态变化 所以要先创建变量保存
Redis
缓存更新
主动更新:高一致性
超时剔除:低一致性
线程安全问题
先操作再删除缓存 好一点
缓存穿透
布隆过滤
缓存空值
缓存雪崩
微服务中讲具体实现
缓存击穿
1.用一个互斥锁防止大家都去数据库写
优点:内存 一致性 简单
缺点:性能 死锁
2.逻辑过期 时间不过期
先进行缓存预热
优点:性能
缺点:一致性 内存
秒杀业务
UUID Redis自增
全局唯一id:唯一、 高可用、 高性能 、递增性、安全性
超卖
乐观锁 :更新的时候看有没有被别人访问过
悲观锁:增加同步锁
一人一单
悲观锁
线程六个状态:
线程池
提高线程利用率、提高程序的响应速度 不用频繁创建销毁线程
便于统一管理线程对象、控制最大并发量
ExcutorService excuteService = new ThreadPoolExcutor(核心线程数,最大线程数,存活时间,时间单位,等待队列,线程工厂,拒绝策略);
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 5; i++) {
final int taskId = i;
executorService.submit(() -> {
System.out.println("Task " + taskId + " is being executed by thread: " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
// 关闭线程池
executorService.shutdown();
Lambda 表达式
Lambda 表达式主要用于实现函数式接口(即只包含一个抽象方法的接口)
遗留:
多级缓存
分布式下的线程安全问题