超大批量向redis导入数据

  |   2 评论   |   1,865 浏览

    日常中有时为了做实验需要向redis导入大量数据

    下面提供一些思路:

    1、循环导入

    key的类型为string,下面是例子脚本

    for((i=1;i<=1000000;i++))
    do
    redis-cli -a "password" -n 0 -p 6379 set "k"$i "v"$i
    done

    这样的坏处显而易见,每次都要建立连接,效率低下,不可取。

    当然你导入几百几千个key倒是没什么问题。


    2、pipeline方式导入


    先把预先的命令导入到一个文本里面

    for((i=1;i<=1000000;i++))
    do
    echo "set k$i v$i" >> /tmp/_t.txt
    done


    执行格式转换

    unix2dos /tmp/_t.txt 


    pipeline导入

    cat /tmp/_t.txt | redis-cli -a "password" -n 0 -p 6379 --pipe


    以上测试下来,100万的数据,在几十秒中搞定,速度嗷嗷的

    参考:http://redis.io/topics/mass-insert


    还有一种情况,比如需要把MySQL中的数据批量导入redis

    假如目前需要把用户元宝表导入到redis中,表 user_gold(user_id, amount) ,每个用户一个key,string类型。

    我们可以这样操作:

    -- 1.sql 保存sql到 1.sql中

    SELECT CONCAT(  
      "*3\r\n",  
      '$3\r\n',  
      'SET\r\n',  
      '$', LENGTH(redis_key), '\r\n',  
      redis_key, '\r\n',
      '$', LENGTH(redis_value), '\r\n',
      redis_value, '\r'
    )  
    FROM (  
      SELECT 
      CONCAT('user:gold:',user_id) AS redis_key,
      amount AS redis_value
      FROM test.user_gold
    ) AS t;

    执行导入操作:

    mysql --raw --skip-column-names -h2.6.3.101 -P1067 -uroot -p'123456' test -A < /data/sql/1.sql | /data/redis/bin/redis-cli -a "password" -n 0 -p 6379 --pipe


    评论

    发表评论

    validate