Mysql到Redis的資料協議(可以按照寫redis的協議,自測已經成功,key值可以自己變化,不一定非要是id)
阿新 • • 發佈:2018-11-11
redis-cli命令列工具有一個批量插入模式,是專門為批量執行命令設計的。這第一步就是把Mysql查詢的內容格式化成redis-cli可用的資料格式。
原理是把要插入到Redis的資料直接轉成Redis協議資料流,通過pipe mode 匯入到Redis.
Redis協議:
*<args><cr><lf> 引數個數
$<len><cr><lf> 第一個引數長度
<arg0><cr><lf> 第一個引數
$<len><cr><lf> 第二個引數長度
<arg1><cr><lf> 第二個引數
…
$<len><cr><lf> 第n個引數長度
<argN><cr><lf> 第n個引數
CREATE TABLE `t_info` ( `Fuid` bigint(64) unsigned NOT NULL , `Fnickname` varchar(70) NOT NULL DEFAULT '', `Fsex` tinyint(3) unsigned NOT NULL DEFAULT '0', `Fsign` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`Fuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
insert into t_info values('111','llw','1','liu');
編寫SQL,把MYSQL資料組合成Redis協議資料流:
SELECT CONCAT( '*8\r\n', '$', LENGTH(redis_cmd), '\r\n',redis_cmd, '\r\n','$', 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, Fuid AS redis_key, 'Fnickname' AS hkey1, Fnickname AS hval1, 'Fsex' AS hkey2, Fsex AS hval2, 'Fsign' AS hkey3, Fsign AS hval3 FROM t_info ) AS t |
然後shell下執行:
mysql -h 127.0.0.1 db_test –skip-column-names –raw < mysql2redis.sql | redis-cli –pipe |
mysql引數說明:
–raw: 使mysql不轉換欄位值中的換行符。
–skip-column-names: 使mysql輸出的每行中不包含列名。
開啟Python直譯器:
>>> import redis
>>> r = redis.Redis(host='localhost', port=6379, db=0) #如果設定了密碼,就加上password=密碼
>>> r.keys() # 列出所有鍵值。(這時候已經存了4個了)
參考:
http://www.oschina.net/translate/mysql-to-redis-in-one-step
http://redis.io/topics/mass-insert
http://redis.io/topics/protocol