Redis批量導入mysql中數據

我們使用redis提供的Pipe的方式將mysql中數據導入到redis中

1.創建mysql數據庫並插入數據

create database test;

create table user(
id int not null,
password varchar(12),
name varchar(20),
phone varchar(11)
);

insert into user values(1,'password1','lipgqiag','18811659586');
insert into user values(2,'password2','zhujingb','18812439876');
insert into user values(3,'password3','xuegmeg','15267424792');

2. 確定redis中存儲結構

本例中我們使用Hash結構來存儲mysql中數據,表明:主鍵名作爲key,其他字段作爲field:value

3. 編寫mysql執行腳本

SELECT CONCAT(  
  "*8\r\n",  -- *表示數組,8表示數組元素個數*,\r\n是linux中分隔符,8這個數字根據下面紅底字段數量進行調整
  '$', LENGTH(redis_cmd), '\r\n',  redis_cmd, '\r\n',   --$表示長字符串,LENGTH(redis_cmd)表示字符串長度,redis_cmd字符串變量
  '$', LENGTH(redis_key), '\r\n',  redis_key, '\r\n',
  '$', LENGTH(hkey1), '\r\n',  hkey1, '\r\n','$', LENGTH(hval1), '\r\n',  hval1, '\r\n'
  '$', LENGTH(hkey2), '\r\n',  hkey2, '\r\n','$', LENGTH(hval2), '\r\n',  hval2, '\r\n'  
  '$', LENGTH(hkey3), '\r\n',  hkey3, '\r\n','$', LENGTH(hval3), '\r\n',  hval3, '\r'     
 
)  
FROM (  
  SELECT  
  'HMSET' as redis_cmd,  
  CONCAT('user:id:' ,id) AS redis_key,  
  'password' AS hkey1, password AS hval1,
  'name' AS hkey2, name AS hval2,
  'phone' AS hkey3, if(phone is not null, phone, '') AS hval3
  FROM user  
) AS t;

以上腳本在mysql中執行後的輸出如下:

*8
$5
HMSET
$9
user:id:1
$8
password
$9
password1
$4
name
$12
liupengqiang
$5
phone
$11
18811459586
*8
$5
HMSET
$9
user:id:2
$8
password
$9
password2
$4
name
$10
zhujiangbo
$5
phone
$11
18812439876
*8
$5
HMSET
$9
user:id:3
$8
password
$9
password3
$4
name
$10
xumengmeng
$5
phone
$11
15230424792

4.Redis協議規範

由於與redis服務通信要遵守RESP協議規範,協議如下:

          客戶端以規定格式的形式發送命令給服務器;

          服務器在執行最後一條命令後,返回結果。

客戶端可以發送的數據類型有以下5種:

間隔符號,在Linux下是\r\n,在Windows下是\n

1)簡單字符串 Simple Strings, 以 "+"加號 開頭

      格式:+ 字符串 \r\n

               字符串不能包含 CR或者 LF(不允許換行)

      eg: "+OK\r\n"

      注意:爲了發送二進制安全的字符串,一般推薦使用後面的 Bulk Strings類型

2)錯誤 Errors, 以"-"減號 開頭

  格式:- 錯誤前綴 錯誤信息 \r\n

               錯誤信息不能包含 CR或者 LF(不允許換行),Errors與Simple Strings很相似,不同的是Erros會被當作異常來看待

      eg: "-Error unknow command 'foobar'\r\n"

3) 整數型 Integer, 以 ":" 冒號開頭

  格式:: 數字 \r\n

      eg: ":1000\r\n"

4) 大字符串類型 Bulk Strings, 以 "$"美元符號開頭,長度限制512M

  格式:$ 字符串的長度 \r\n 字符串 \r\n

               字符串不能包含 CR或者 LF(不允許換行);

      eg: "$6\r\nfoobar\r\n"    其中字符串爲 foobar,而6就是foobar的字符長度

            "$0\r\n\r\n"       空字符串

            "$-1\r\n"           null

5)數組類型 Arrays,以 "*"星號開頭

  格式:* 數組元素個數 \r\n 其他所有類型 (結尾不需要\r\n)

             注意:只有元素個數後面的\r\n是屬於該數組的,結尾的\r\n一般是元素的

      eg: "*0\r\n"      空數組

           "*2\r\n$2\r\nfoo\r\n$3\r\nbar\r\n"      數組包含2個元素,分別是字符串foo和bar

    "*3\r\n:1\r\n:2\r\n:3\r\n"       數組包含3個整數:1、2、3

           "*5\r\n:1\r\n:2\r\n:3\r\n:4\r\n$6\r\nfoobar\r\n"  包含混合類型的數組

           "*-1\r\n"         Null數組

           "*2\r\n*3\r\n:1\r\n:2\r\n:3\r\n*2\r\n+Foo\r\n-Bar\r\n"   數組嵌套,外層數組包含2個數組,整理後如下:

                 "*2\r\n

      *3\r\n:1\r\n:2\r\n:3\r\n

      *2\r\n+Foo\r\n-Bar\r\n"

5. 執行腳本

mysql -h localhost -uroot -p123456 test --default-character-set=utf8 --skip-column-names --raw < /home/lpq/order.sql | /usr/local/redis-5.0.5/bin/redis-cli -h localhost -p 6379 -a 12345 --pipe

#-h host -uroot -p123456 test 分別爲:mysql遠程地址,用戶名,密碼,數據庫名
#/usr/redis/order.sql | /usr/redis/redis-cli 分別爲sql文件和redis客戶端文件目錄的地址
#-h host -p 6379 -a 123456  分別爲redis遠程地址,端口,密碼
#–raw: 使mysql不轉換字段值中的換行符。
#–skip-column-names: 使mysql輸出的每行中不包含列名。

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章