淺談 Redis 與 MySQL 的耦合性以及利用管道完成 MySQL 到 Redis 的高效遷移

shawnloong發表於2015-06-18
    ㈠ 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


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]

[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


       ③ 開始匯入

[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 裡查詢

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


<!-- Baidu Button BEGIN --&gt

相關文章