從MySQL到Redis,提公升資料遷移的效率

2021-09-02 12:27:33 字數 1252 閱讀 2874

題外話:看到一篇不錯的從mysql遷移資料到redis的解決方案,特此記錄一下。

做開發的同學都知道,一旦設計到底層儲存優化,資料結構甚至資料庫的變更,通常都會進行資料遷移的工作。如果系統執行時間過長,資料遷移的數量可能非常龐大。這時候,如何進行高效的資料遷移,實際也是上線質量的直接影響因素之一。

場景是從mysql中將資料匯入到redis的hash結構中。當然,最直接的做法就是遍歷mysql資料,一條一條寫入到redis中。這樣可能沒什麼錯,但是速度會非常慢。而如果能夠使mysql的查詢輸出資料直接能夠與redis命令列的輸入資料協議相吻合,可能就省事多了。

根據什麼都測試,他800w的資料遷移,時間從90分鐘縮短到2分鐘。

廢話說了一堆,下面是具體案例。

mysql資料表結構:

create table events_all_time ( id int(11) unsigned not null auto_increment, action varchar(255) not
null, count int(11) not null default 0, primary key (id), unique key uniq_action (action) );
redis儲存結構:

hset events_all_time [action] [count]
下面是重點,能過下面sql語句將mysql輸出直接變更成redis-cli可接收的格式:

-- events_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, 'events_all_time' as redis_key, action as hkey, count as hval from events_all_time ) as t
然後用管道符重定向輸出即可:

mysql stats_db

--skip-column-names --raw < events_to_redis.sql | redis-cli --pipe

從MySQL到Redis 提公升資料遷移的效率

場景是從mysql中將資料匯入到redis的hash結構中。當然,最直接的做法就是遍歷mysql資料,一條一條寫入到redis中。這樣可能沒什麼錯,但是速度會非常慢。而如果能夠使mysql的查詢輸出資料直接能夠與redis命令列的輸入資料協議相吻合,可能就省事多了。根據測試800w的資料遷移,時間從...

redis 從入門到放棄

keys ping 測試客戶機與伺服器的連線 info 檢視環境資訊,比如客戶端數量等 config get 檢視系統配置資訊 dbsize 有多少個key keys 檢視所有key del key 刪除指定key type key 返回 key 所儲存的值的型別。expire key time i...

Redis從入門到入門

2安裝1.1支援的儲存結構 remote dictionary server 以字典儲存資料,允許其他應用通過tcp協議訪問字典內容。支援的鍵值型別 優點 redis的字典儲存方式和多重鍵值儲存方式,使得程式設計師可以直接將程式中的資料對映到redis中,資料在redis中的儲存方式和其在程式中的儲...