REDIS從LINUX檔案寫入批量資料

2021-07-14 08:02:50 字數 1967 閱讀 5481

cat data.txt | redis-cli --pipe

附從mysql遷移的乙個高效技巧!

在把乙個大表從 mysql 遷移到 redis 時,你可能會發現,每次提取、轉換、匯入一條資料是讓人難以忍受的慢!這裡有乙個技巧,你可以通過使用管道把 mysql 的輸出直接輸入到 redis-cli輸入端,這可以使兩個資料庫都能以他們的最頂級速度來執行。

使用了這個技術,我把 800 萬條 mysql 資料匯入到 redis 的時間從 90 分鐘縮短到了兩分鐘。

mysql到redis的資料協議

redis-cli命令列工具有乙個批量插入模式,是專門為批量執行命令設計的。這第一步就是把mysql查詢的內容格式化成redis-cli可用的資料格式。here we go!

我的統計表:

create

table

events_all_time (  

id int

(11) unsigned 

notnull

auto_increment,  

action

varchar

(255) 

notnull

,  count

int(11) 

notnull

default

0,  

primary

key(id),  

unique

keyuniq_action (

action

)  ); 

準備在每行資料中執行的redis命令如下:

hset events_all_time [

action

] [count

]

按照以上redis命令規則,建立乙個events_to_redis.sql檔案,內容是用來生成redis資料協議格式的sql:

-- 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'

asredis_cmd,  

'events_all_time'

asredis_key,  

action

ashkey,  

count

ashval  

from

events_all_time  

) as

t

ok, 用下面的命令執行:

mysql stats_db 

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

很重要的mysql引數說明:

--raw: 使mysql不轉換字段值中的換行符。

--skip-column-names: 使mysql輸出的每行中不包含列名。

Linux檔案寫入操作

上一講寫到linux環境下檔案的建立,這講承上啟下 先看 include include include include include include intmain printf open success fd d n fd write fd,buf,strlen buf close fd re...

文字檔案從磁碟讀取 寫入

using system using system.text using system.io namespace x.common return result 寫入文字檔案,按預設編碼 文字檔案路徑包括檔名 寫入內容 public static void write string filepath,...

Redis批量寫入資料

生產中的有些場景,我們經常需要大批量的往redis中寫入資料,如果我們採用單條迴圈寫入的話,不僅效率低下,而且可能會出現頻繁的建立和銷毀redis連線,這些都是很不合理的.對此,我們可以採用jedis的父類中的pipelined 方法獲取管道,它可以實現一次性傳送多條命令並一次性返回結果,這樣就大量...