redis-cli命令列工具有乙個批量插入模式,是專門為批量執行命令設計的。這第一步就是把mysql查詢的內容格式化成redis-cli可用的資料格式。
原理是把要插入到redis的資料直接轉成redis協議資料流,通過pipe mode匯入到redis.
redis協議:
*引數個數
$第乙個引數長度
第乙個引數
$第二個引數長度
第二個引數
…$第n個引數長度
第n個引數
create table `t_info` (
`fuid` bigint(64) unsigned not null ,
`fnickname` varchar(70) not null default '',
`f***` 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,
'f***' as hkey2, f*** 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個了)
參考:
MYSQL快速同步資料到Redis
舉例場景 儲存遊戲玩家的任務資料,遊戲伺服器啟動時將mysql中玩家的資料同步到redis中。當然你可以如下思路 今天我們用linux系統終端執行該shell指令碼或者直接執行該系統命令,即可將mysql資料庫game db的表table mission資料同步到redis中鍵missions中去。...
MYSQL快速同步資料到Redis
舉例場景 儲存遊戲玩家的任務資料,遊戲伺服器啟動時將mysql中玩家的資料同步到redis中。從mysql中將資料匯入到redis的hash結構中。當然,最直接的做法就是遍歷mysql資料,一條一條寫入到redis中。這樣沒什麼錯,但是速度會非常慢。如果能夠想法使得mysql的查詢輸出資料直接能夠與...
mysql資料快速同步到redis
由於工作中有時需要把mysql的資料同步到redis,用python的redis庫一條條塞進去太過耗時,查了下資料發現可以用redis協議快速實現。一 redis協議的格式 引數個數 r n 引數a位元組長度 r n 引數a r n 引數b位元組長度 r n 引數b r n 比如 sadd name...