工作中的亮点及遇到的坑

我写的一个定时任务,是每天晚上两点去将一个表中数据以设备id进行分组 之后 按照一定的规则进行处理完之后 将数据压缩成单条,存入另一个表。
我的业务是如果部署的多实例 我需要让两个实例同时去处理 从定时任务表取出来的数据。这是后期的扩展性问题。 那么在多实例的情况下 我该如何在不同实例之间做负载 同时去添加数据到压缩表提升速度。 这时 我想到的是redis 锁 ,首先我们得知道在redis锁中的一个命令 setnx  如果不存一个键 那么就设置一个键 和值 如果存在 则什么也不干。在redisTemplate中这个命令是setifabsent(),那么来看具体的业务,如果两台实例同时在凌晨两点去压缩前一天的数据,如果不做限制那么他们就会同时去查库里的数据 同时压缩 同时删除原表数据,这样数据就完全乱套了。所以 在同一时刻我只能让一个实例去将原表中的数据去出来 然后让两个实例同时去添加数据到新表。那么这个时候有一个问题 如何让两个实例均衡的去添加这些数据呢。后边说。
首先我利用setnx 在redis中设置一个键值对 也就是锁, 因为这个定时任务是每天晚上都会去执行的,所以这个锁必须去设置过期时间。这样的话 第一个进来的实例会先获取锁,并将取出来的数据处理之后放到redis中,为什么放redis 不直接存到数据库呢 此时是为了让两个实例同时去添加数据 才放到redis 那么 如何实现的呢?此时又用到了redis 的另一个命令leftpush或者rightpush (此命令是redis处理list集合的),我将取出来的数据通过push命令存放到redis 中。设置键为list 值为刚刚从数据库取出来集合。刚刚说到 两台实例是同时在两点执行这段代码,如果第一个实例获取了锁 那么第二个实例就会走else ,在else中 我让第二台实例去扫描redis是否存在list键 如果存在list键那么说明第一个实例已经将数据放到了redis中,此时就执行新增的操作,介于第一个实例去压缩存放数据时,需要时间,所以二实例刚刚进来肯定是没有 所以我就给他设置了休眠时间 每隔一段时间去扫描 是否存在 如果存在就添加,第一个实例将数据存进redis之后 也就开始执行新增操作。
那么 问题又来了 我如何将redis的数据取出来 让两个实例同时去新增 并且 还不重复呢?

再来一个命令:redis 的leftpop命令 将redis存进去的集合数据 依次从左边或者右边取出来 取出来之后 并将此条数据从redis中删除,这样每个实例每次只能取到一条数据,这样就避免的数据重复的问题。实现了两个实例同时去新增数据减少了执行时间。
坑: 在将数据处理完之后 存放到redis中利用的是redis处理list的命令pushAll命令。用此命令去存数据的时候。是这样的:假如我有1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值