首页 > 数据库 >CompletableFuture多线程与redis分布式锁

CompletableFuture多线程与redis分布式锁

时间:2024-01-15 10:06:17浏览次数:31  
标签:futureAll keys redis CompletableFuture redisLock 多线程 threadPoolTaskExecutor

@Autowired
public RedisTemplate redisTemplate;

boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", "redisLock");

// 获取锁

           boolean redisLock = redis.getRedisLock();

           if(redisLock){

               // 创建线程池

               ThreadPoolTaskExecutor threadPoolTaskExecutor = SpringUtils.getBean("threadPoolTaskExecutor");

               // 创建多线程

               List<CompletableFuture<Boolean>> futureAll = new ArrayList<>();

               Collection<String> keys = redis.keys(CacheConstants.TRADE);

               keys.forEach(key -> {

                   CompletableFuture future = CompletableFuture.runAsync(() -> {

                       fuelGunCommandService.saveOrUpdateTrade(key);

                   }, threadPoolTaskExecutor);

                   futureAll.add(future);

               });

               //等待全部执行完成

               CompletableFuture.allOf(futureAll.toArray(new CompletableFuture[0])).join();

               // 完成之后释放锁

               redis.delRedisLock();

           }

标签:futureAll,keys,redis,CompletableFuture,redisLock,多线程,threadPoolTaskExecutor
From: https://blog.51cto.com/momo1226/9247887

相关文章

  • Redis - Design
           ......
  • 多线程
    01-程序、进程与线程1.程序、进程和线程的区分:程序(program):为完成特定任务,用某种语言编写的`一组指令的集合`。即指一段静态的代码。进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。程序是静态的,进程是动态的。进程作为操作系统调度和分配......
  • Redis - Use case of GETRANGE, SETRANGE, MGET, MSET
            ......
  • Redis Commands - GETRANGE SETRANGE
      Overwritespartofthestringstoredat key,startingatthespecifiedoffset,fortheentirelengthof value.Iftheoffsetislargerthanthecurrentlengthofthestringat key,thestringispaddedwithzero-bytestomake offset fit. 127.......
  • Redis - Use case of expiration options
        Automaticallydeletingthecachedkey: ......
  • JUC并发编程 CompletableFuture 获得结果和触发计算 常用方法(二)
    1获得结果和触发计算1.1获取结果publicTget()publicTget(longtimeout,TimeUnitunit)publicTjoin()--->和get一样的作用,只是不需要抛出异常publicTgetNow(TvaluelfAbsent)--->计算完成就返回正常值,否则返回备胎值(传入的参数),立即获取结果不阻塞1......
  • JUC并发编程 CompletableFuture 业务代码实战
    1需求电商网站比价需求分析:1.1需求说明:a.同一款产品,同时搜索出同款产品在各大电商平台的售价b.同一款产品,同时搜索出本产品在同一个电商平台下,各个入驻卖家售价是多少1.2输出返回:a.出来结果希望是同款产品的在不同地方的价格清单列表,返回一个List例如:《Mysql》......
  • redis工具类封装
    封装Redis工具类方法1:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间方法2:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置逻辑过期时间,用于处理缓存击穿问题方法3:根据指定的key查询缓存,并反序列化为指定类型,利用缓存空......
  • JUC并发编程 用CompletableFuture 创建异步任务
    1CompletableFuture对Future的改进1.1CompletableFuture为什么会出现get()方法在Future计算完成之前会一直处在阻塞状态下,阻塞的方式和异步编程的设计理念相违背。isDene()方法容易耗费cpu资源(cpu空转),对于真正的异步处理我们希望是可以通过传入回调函数,在Future结束时自动......
  • JUC 异步编程利器 CompletableFuture 介绍
    1从FutureTask到CompletableFuture1.1FutureFuture接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消异步任务的执行、判断任务是否被取消、判断任务执行是否完毕等。举例:比如主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开......