1.說明
通過管道傳輸pipe將MySQL數據批量導入Redis。
Redis客戶端使用RESP(Redis的序列化協議)協議與Redis的服務器端進行通信。
在RESP協議中,有些的數據類型取決於第一個字節:
1、對於簡單字符串,回覆的第一個字節是“+”
2、對於錯誤,回覆的第一個字節是“ - ”
3、對於整數,回覆的第一個字節是“:”
4、對於批量字符串,回覆的第一個字節是“$”
5、對於數組,回覆的第一個字節是“*”
在RESP協議中,協議的不同部分始終以“\r\n”(CRLF)結尾。
2.腳本
- 編寫SQL語句,把Mysql數據組合成Redis協議數據流
–raw: 使mysql不轉換字段值中的換行符。
–skip-column-names: 使mysql輸出的每行中不包含列名。
redis-cli –pipe 表示使用redis pipe管道把數據導入到redis中
[root@host-192-168-1-1 redis-5.0.3]# mysql -h 192.168.1.1 -uroot -p[password] -D[database] --skip-column-names --raw </root/import_single_redis.sql |src/redis-cli --pipe
- 數組中加入HMSET命令,將store_id作爲HMSET的key
SELECT *
FROM
(
SELECT
CONCAT(
"*4\r\n",
'$', LENGTH(redis_cmd), '\r\n',redis_cmd, '\r\n',
'$', LENGTH(redis_key), '\r\n',redis_key, '\r\n',
'$',LENGTH(key_term_id),'\r\n',key_term_id,'\r\n',
'$',LENGTH(val_term_id),'\r\n',val_term_id,'\r\n'
) AS Res
FROM
(
SELECT
'HMSET' AS redis_cmd,
store_id AS redis_key,
'term_id' AS key_term_id,
if(isnull(term_id),'',term_id) AS val_term_id
FROM
mchnt limit 1
) AS m
) r WHERE NOT ISNULL(r.Res)