【java入门到放弃】杂记 设计访问后端时需要刷新token过期时间但是有些路径不需要token如果只在需要token的路径拦截刷新会导致一些情况不会刷新到所以该再设计一个拦截所有路径的拦截器这里刷新token过期时间。操作数据库时删除缓存。我们要先改数据库再删除缓存。否则删除缓存后修改数据库还没完成另一线程来查询就会把旧数据又添加到缓存导致数据库缓存不一致。redis缓存解决缓存穿透问题可以缓存空对象也可以使用布隆过滤器。解决缓存雪崩问题可以是给不同的Key的TTL添加随机值也可以给缓存业务添加降级限流策略解决缓存击穿问题可以使用互斥锁或者使用逻辑过期的策略。AtomicLong一个线程安全的 long 变量无锁实现基于CASCompare And Swap乐观锁缺点自旋消耗 CPU、只能保证单变量、ABA 问题 值变化但又变回原值CAS 检测不到LongAdder适合高并发计数统计请求数QPS 统计不适合需要“实时精确值”余额计算LongAdder 通过将单点更新分散到多个变量cell上降低 CAS 冲突在高并发场景下比 AtomicLong 性能更高但读取结果时是最终一致而非实时精确。分布式锁利用setnx这个方法来实现如果插入key成功则表示获得到了锁如果有人插入成功其他人插入失败则表示无法获得到锁利用这套逻辑来实现分布式锁锁误删需要给锁设置过期时间防止死锁。阻塞了锁过期了别的线程获取并运行阻塞好了继续执行最终把别的线程的锁删了。解决方案解决方案就是在每个线程释放锁的时候去判断一下当前这把锁是否属于自己如果属于自己则不进行锁的删除。存在重入问题存在锁不住问题需要redission来解决。redission看门狗WatchDog机制解决锁过期导致并发执行问题。默认锁时间30秒。每10秒自动续期实现了可重入锁可选公平锁实现了读写锁