美文网首页
并发导致分配或写入异常

并发导致分配或写入异常

作者: 灿烂的GL | 来源:发表于2024-03-10 09:47 被阅读0次

    背景:给大批量用户分配账号,用户和账号关系为一对一,支持tps150左右。
    解决方案:redis队列存储账号,redis锁(生成账号)+多线程(处理分配逻辑)
    代码逻辑

    //多线程生成账号
     threadPoolTaskExecutor.submit(() -> getInfo(redisCacheBatchNum));
    //生成账号逻辑
     private void getInfoToRedisCache(Integer addNum) {
            Long value = redisTemplate.opsForValue().increment(LOCK_KEY, 1);
            redisTemplate.expire(LOCK_KEY, 10, TimeUnit.SECONDS);
            if (value == 1) {
                try {
                    Integer cacheSize = redisTemplate.opsForSet().size(REDIS_CACHE_KEY).intValue();
                    if (cacheSize < redisCacheNum) {
                        log.info("{}目前获取锁成功,当前缓存数量为{},开始入队",Thread.currentThread().getName(),cacheSize);
                。。。。(生成账号逻辑)
                       //将生成账号放入到redis队列中,注意set可以保证唯一性
                        resultList.stream().forEach(e -> redisTemplate.opsForSet().add(REDIS_CACHE_KEY, e));
                    }
                } finally {
                    log.info("{}入队结束释放锁",Thread.currentThread().getName());
                    redisTemplate.delete(LOCK_KEY);
                }
            }
        }
    //获取redis队列中账号,然后可以和用户进行绑定
    redisTemplate.opsForSet().pop(REDIS_CACHE_KEY);
    

    如果并发量小,数据压力不大,可以给数据库加行所,具体实现可以在表中增加一个version字段,每次更新或新增数据拿出上一次的version作为判断条件,如果version不变version递增,否则更新或新增失败。

    相关文章

      网友评论

          本文标题:并发导致分配或写入异常

          本文链接:https://www.haomeiwen.com/subject/ojsvodtx.html