1. 程式人生 > >Mysql到Redis的資料協議(可以按照寫redis的協議,自測已經成功,key值可以自己變化,不一定非要是id)

Mysql到Redis的資料協議(可以按照寫redis的協議,自測已經成功,key值可以自己變化,不一定非要是id)

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

來源:https://blog.csdn.net/llw01/article/details/21872985