多线程执行器
- 封装了一个可指定线程名的方法
- 可通过
ThreadExecutor.execute(()->{do sth.});
异步执行逻辑 - 可通过
Future<V> future=ThreadExecutor.submit(()->{do sth.});
提交可返回结果的执行,并通过future.get()
获取返回结果(get会等待线程执行完逻辑) - 特殊场景独立线程池可通过
ThreadExecutor.createThreadPoolExecutor
创建
4.疑问点
- 为什么线程池大小指定为2n(n为系统cpu数)?
- CPU密集型任务一般用CPU核心数+1
- IO密集型任务一般用2*CPU核心数
MyBatis-Plus
1.具体代码点此跳转
2.使用步骤
- 引入
mybatis-plus-boot-starter
依赖 application.yml
加mybatis-plus
相关配置- 实体类加
@TableName("xxx")
注解(对应mysql表名) mapper
层继承BaseMapper
接口用于提供db操作方法(CRUD)service
层继承ServiceImpl
类用于提供业务操作方法(CRUD、分页等)- 具体CRUD可参考
1.具体代码
3.优点
- 不用写复杂xml文件,容易出错
- 封装了简易的API接口(如CRUD、分页等)
Guava Cache
1.具体代码点击跳转
2.代码介绍&使用
refreshAfterWrite
:第一次请求会load一遍缓存,并在设置时间内读到的都是缓存的旧值。当设置时间到了,下次请求来了会有进程去异步load一遍新的,新的结果返回之类get读到的都是旧值expireAfterWrite
:设置缓存在指定时间内如果没有更新则会移除(一般与refreshAfterWrite
搭配使用)
3.注意点
- 报错CacheLoader returned null for key怎么办?
load()
方法不允许返回null,如需要需包一层Optional
- 如原来的
String load(String key)
改为Optional<String> load(String key)
- 返回的
Optional
对象通过调用orElse(other)
方法(如果为null则返回other)获取到实际对象
Redisson
1.具体代码点击跳转
2.介绍
redisson
实现了分布式和可扩展的java数据结构- 需要配合
redis
使用,host为localhost时需启动redis server
3.使用步骤
- 添加
redisson
依赖 - 先通过
RedissLockUtil.getRedissonLock()
拿到分布式锁DistributedLocker
- 然后通过
tryLock()
尝试拿到锁 - 最后在
finally
代码块执行unlock()
即可