代码库


多线程执行器

1.具体代码点此跳转
2.相关笔记点此跳转
3.代码介绍&使用

  • 封装了一个可指定线程名的方法
  • 可通过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.ymlmybatis-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()即可

文章作者: GaryLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 GaryLee !
  目录