为了提升系统性能,在不少系统中使用Redis做为缓存数据库,那么在系统启动或重启后,但愿把DB的数据初始化到Redis以提升系统的性能,应该如何批量导入大量的数据呢?mysql
要导入数据,就要先了解Redis的协议(RESP
),而后用sql拼接数据交给redis导入,RESP
格式以下:linux
*n (*表示数组,按$划分) $n (表示参数长度) cmd (表示命令) $n (表示参数长度) field (表示字段) $n (表示参数长度) value (表示值) ...
咱们拼个简单的数据,以下:redis
*4\r\n$5\r\nHMSET\r\n$8\r\nperson:1\r\n$2\r\nid\r\n$1\r\n1\r
上面表示有4组,5表示HMSET的长度,8表示person:1长度。。。
命令:HMSET person:1 id 1
sql
下面咱们再写下sql,以下:数据库
SELECT CONCAT( "*8\n", '$', LENGTH(redis_cmd), '\n', redis_cmd, '\n', '$', LENGTH(hash), '\n', hash, '\n', '$', LENGTH(hkey0), '\n', hkey0, '\n', '$', LENGTH(hval0), '\n', hval0, '\n', '$', LENGTH(hkey1), '\n', hkey1, '\n', '$', LENGTH(hval1), '\n', hval1, '\n', '$', LENGTH(hkey2), '\n', hkey2, '\n', '$', LENGTH(hval2), '\n', hval2, '' ) FROM ( SELECT 'HMSET' AS redis_cmd, concat('hash:', id) AS hash, 'id' AS hkey0, id AS hval0, 'age' AS hkey1, age AS hval1, 'name' AS hkey2, name AS hval2 FROM mytable ) AS t;
注意:换行符 windows使用 \n ,linux使用 \r\n
windows
上面的sql能够组装redis须要的数据,下面咱们编写导入命令:数组
mysql -uroot -proot -Dxfdb --default-character-set=utf8 --skip-column-names --raw < mysql_to_redis.sql | redis-cli -h 127.0.0.1 --pipe
--raw: 使mysql不转换字段值中的换行符。
--skip-column-names: 使mysql输出的每行中不包含列名。
--pipe 将命令封装成redis通讯协议定义的数据格式,批量发送给redis执行缓存
执行命令后,若是出现相似如下提示,这说明导入正确:性能
All data transferred. Waiting for the last reply... Last reply received from server. errors: 0, replies: 3
能够打开 Redis-cli 输入dbsize或者keys *命令来进行查询。
学习交流,请加群:64691032学习