首页 > 数据库 >记录 RedisTemplate.executePipelined 使用问题

记录 RedisTemplate.executePipelined 使用问题

时间:2023-04-17 17:45:17浏览次数:44  
标签:info String 记录 stop private userIdList key executePipelined RedisTemplate

需求,向redis写入2000万个key

@Slf4j
@Component("job2")
public class ToRedis2 implements IJob {

    private AtomicLong count = new AtomicLong(0);
    private Long oldCount=0L;
    private List<String> userIdList = new ArrayList<>();

    private ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 4);

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Setter
    @Getter
    @Value("${user.limit:100000}")
    private volatile int userLimit;
    @Setter
    @Getter
    @Value("${user.skip-count:0}")
    private volatile int skipCount;
    @Setter
    @Getter
    @Value("${user.batch-count:10000}")
    private volatile int batchCount;

    private AtomicBoolean stop=new AtomicBoolean(false);

    private void toRedis() throws IOException {
        String root =ystem.getProperty("user.dir") + "/2021";
        if (userIdList.isEmpty()) {
            // userId
            String filePath = root + "/user.txt";
            readFile(filePath, 0, userIdList);
//            save();
        }

        for (String t : type) {
            // 组装数据并写入Redis
            es.execute(()->{
                List<String> info = new LinkedList<>();
                exit:for (int i = 0; i < userIdList.size(); i++) {
                    if (i < skipCount) {
                        continue;
                    }
                    if (stop.get()) {
                        log.info("job2 stop");
                        break exit;
                    }
                    String key = "app:xxx:202105:userid_" + userIdList.get(i) + ":" + t;
                    info.add(key);
                    if (info.size() == getBatchCount() || i == userIdList.size() - 1) {
                        if (!stop.get()) {
                            executePipelined(info);
                            info.clear();
                        }
                    }
                }
            });
        }
    }

    private void executePipelined(List<String> info) {
        RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
        redisTemplate.executePipelined((RedisCallback<String>) connection -> {
            info.forEach((key) -> {
                if(!stop.get()){
                    long c=count.incrementAndGet();
                    connection.set(serializer.serialize(key), serializer.serialize(String.valueOf(c)));
                }
            });
            return null;
        }, serializer);
    }

}

分批处理数据,此处将数据分为10000条每批,这样不会造成由于接收redis返回结果而造成内存溢出问题

标签:info,String,记录,stop,private,userIdList,key,executePipelined,RedisTemplate
From: https://www.cnblogs.com/fuqian/p/17326590.html

相关文章

  • Jedis与RedisTemplate的区别
    Jedis与RedisTemplate的区别:Jedis是Redis官方推荐的、面向Java的操作Redis的客户端,可以用JedisPool来获得连接进行get、set、del等操作相对简单,而RedisTemplate是SpringDataRedis中对JedisApi的高度封装。SpringDataRedis相对于Jedis来说,可以方便地更换Redis的Java客户端,还......
  • 菜鸟记录:c语言实现PAT甲级1004--Counting Leaves
    好消息:与上题的Emergency是同样的方法。坏消息:又错了&&c++真的比c方便太多太多。Afamilyhierarchyisusuallypresentedbyapedigreetree.Yourjobistocountthosefamilymemberswhohavenochild.InputSpecification:Eachinputfilecontainsonetest......
  • Java开发笔记13(树的结构修改记录)
    1.Controller:/***区域树生成*/@GetMapping("/list")privateResultregionTree(){Stationstation=getStation(getUser());StringstationCode=station.getStationTelecode();List<NewTreeVo>tree=stationInfRelaService.regionTree(stat......
  • Linux 防止命令被记录
    更新记录2023年4月17日初始化,内容截取自ChatGPT.问题在终端中输入的内容默认会被记录。有时候输入敏感信息需要避免被记录。解决在Linux中防止命令记录主要有以下两种方式:方法1:在命令前添加空格在Linux中,命令历史记录保存在“~/.bash_history”文件中。如果在命令前......
  • 记录selenium,python自动化测试中的chromedriver.exe地址和打开后自动关闭浏览器问题
    selenium的官方地址为:https://selenium-python.readthedocs.io/index.html镜像地址:https://npmmirror.com/#导入webdriverfromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy#调用键盘按键操作时需要引入的Keys包fromselenium.webdriver.common.k......
  • InnoDB 记录结构
    我们前边唠叨请求处理过程的时候提到过,MySQL服务器上负责对表中数据的读取和写入工作的部分是存储引擎,而服务器又支持不同类型的存储引擎,比如InnoDB、MyISAM、Memory啥的,不同的存储引擎一般是由不同的人为实现不同的特性而开发的,真实数据在不同存储引擎中存放的格式一般是不同的,甚......
  • UI自动化,关键数据记录
    关键数据记录的作用内容作用执行日志1.记录代码的执行记录,方便复现场景2.可以作为bug依据截图1.断言失败或成功截图2.异常截图达到丰富报告的作用3.可以作为bug依据pagesource协助排查报错时元素当时是否存在页面上执行日志日志配置脚本日......
  • 论文阅读记录1——Lmbff(更好的基于微调的语言模型)读后归纳
    方法:基于GPT-3的强大功能:只要给出一个自然语言提示和一些任务演示,GPT-3就能够做出准确的预测,而无需更新其底层局域网的任何权重。在一个更实际的场景中研究了少数镜头学习,在那里我们使用了更小的语言模型,其中的微调在计算上是有效的。我们提出了lm-bff(更好的语言模型的少量......
  • AtCoder 板刷 / vp 记录
    ARC104AtCoder传送门A题解一道小学数学题,$X=\frac{A+B}{2},Y=\frac{A-B}{2}$。B题解一道暴力题。发现子串合法的充要条件是$cnt_{\text{A}}=cnt_{\text{T}}\landcnt_{\text{G}}=cnt_{\text{C}}$,暴力统计即可。C题解简单区间dp。发现$[1,2n]$可以拆......
  • 中小型软件企业初始管理记录20140922
    对于人数少于100人的中小型软件企业,员工的初始积极性是最重要的,企业应该考虑做到以下几点:1、薪资可以不高,但企业承诺一定要做到;2、通信费交通费必须考虑合理报销,报销过程要简单;3、加班餐费必须解决好;4、频繁加班后,需要考虑一定形式的团队建设,而且越快越好;5、员工的倒休要鼓励,不能让......