Redis如何大批量处理数据

情景(面试题)

有些时候,Redis实例需要装载大量用户在短时间内产生的数据。该怎么做?

分析

如果我们直接循环要插入的数据,每一条数据通过set方法插入数据库,这势必会消耗大量的网络连接和耗时。

解决方法

1.管道(pipe)

就是把n个命令通过一个pipe发送到服务器端,服务器端处理完成以后再返回一个响应结果。而一条一条set需要n次请求n次处理n次响应,而管道只要一次请求n次处理一次响应。由此可以见,pipe不是原子性的。

    JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);
    Jedis jedis = jedisPool.getResource();
    long start = System.currentTimeMillis();
    Pipeline pipeline = jedis.pipelined();
    for (int i = 0; i < 1000000; i++) {
        pipeline.set("Key" + i, "Value" + i);
    }

    pipeline.sync();
    long end = System.currentTimeMillis();
    System.out.println(end - start);

优点:减少网络耗时。
弊端:不是原子操作。需要适当去处理每个pipe传输命令的多少,因为会在回复这个pipe的返回值,会占有大量内存。

2.通过pipe mode模式

这种方式需要手动生成Redis命令集合。然后使用cat data.txt | redis-cli --pipe 命令在客户端命令行执行。

测试脚本:
#! /bin/bash/

for((i=1;i<=1000000;i++))
    do
    echo "SET key${i} value${i}" >> redis.txt 
done
startTime=`date +'%s'`
cat redis.txt | redis-cli --pipe -a password
endTime=`date +'%s'`
echo ${endTime}
echo `expr ${endTime} - ${startTime}` >>time

优点:很快。通过上面两个执行100w条命令,pipe-mode执行大约是3s,pipe命令是5.4s。(官网)大量插入数据的同时又需要执行其他新命令时,这时读取数据的同时需要确保请可能快的的写入数据。
缺点:可能需要手动生成命令集合的文本。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值