淺談Redis與MySQL的耦合性以及利用管道完成MySQL到Redis的高效遷移 ㈠ Redis 與 MySQL 的耦合性 在業務架構早期、我們便該"吃著碗裡的看著鍋裡的"、切莫讓MySQL 有夢、而Redis 無心 畢竟、有些關系型的結構不適合放到Redis跑、"男女搭配、干活不累"嘛、推薦讓MySQL與Redis喜結連理 其次、這 2 人、一般是在不同場景做選擇、而不會在性能上選擇、 只有在 2 者都可用的情況下、綜合性能、硬件成本、運維成本等選擇 比如、網頁游戲啟用 Redis+MySQL: 游戲中的:好友關系、排行榜、計數器、隊列、cache都很適合通過 Redis來實現 再舉個例子是新浪微博的架構、比如用戶關注關系: 在 MySQL中是 <粉絲,關注的人>這樣一行一行存儲的。而在 Redis中你可以存成一個set,或者zset等 大體流程是由 MySQL 復制到 Redis 的 基本結構應該是: 1. 發微博-- > 進入消息隊列-- > 存入MySQL-- > 復制到Redis 2. 查詢 -- > 查詢緩存-- > 查詢Redis -- > 查詢MySQL ㈡ 快速遷移 MySQL →→ Redis ① MySQL 要導出的表 david_lin [plain] mysql> desc david_lin; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | myname | varchar(25) | NO | UNI | NULL | | | mymoney | int(11) | NO | | 0 | | +---------+-------------+------+-----+---------+-------+ mysql> select * from david_lin; +----+--------+---------+ | id | myname | mymoney | +----+--------+---------+ | 1 | david | 100000 | | 2 | rocky | 200000 | +----+--------+---------+ ② 編寫導出腳本 每行數據中執行的 Redis命令如下: HSET david_lin [myname] [mymoney] [plain] [root@odd ~]# cat mysql_to_redis.sql SELECT CONCAT( "*4\r\n", '$', LENGTH(redis_cmd), '\r\n', redis_cmd, '\r\n', '$', LENGTH(redis_key), '\r\n', redis_key, '\r\n', '$', LENGTH(hkey), '\r\n', hkey, '\r\n', '$', LENGTH(hval), '\r\n', hval, '\r' ) FROM ( SELECT 'HSET' AS redis_cmd, 'david' AS redis_key, myname AS hkey, mymoney AS hval FROM david_lin ) AS t ③ 開始導入 [plain] [root@odd ~]# mysql -uroot -poracle test --skip-column-names --raw < mysql_to_redis.sql | redis-cli --pipe All data transferred. Waiting for the last reply... Last reply received from server. errors: 0, replies: 0 ④ 在Redis 裡查詢 [plain] redis 127.0.0.1:6379> hgetall david 1) "david" 2) "100000" 3) "rocky" 4) "200000" 這裡僅是個 demo、數據量小、不過、看這結果、有些類似行轉列哈、列運算了、有木有 :) By David Lin 2013-05-30 Good Lucky