由於工作中有時需要把mysql的資料同步到redis,用python的redis庫一條條塞進去太過耗時,查了下資料發現可以用redis協議快速實現。
一 . redis協議的格式:
*《引數個數》\r\n
$《引數a位元組長度》\r\n《引數a>\r\n
$《引數b位元組長度》\r\n《引數b>\r\n
……
比如
sadd name 李飛
轉換為redis協議格式則為:
*3\r\n$4\r\nsadd\r\n$6\r\n李飛\r
二 . 通過linux命令列傳送協議
echo -en '*3\r\n$4\r\nsadd\r\n$6\r\n李飛\r' | redis-cli --pipe -d 0 -a 945555
# '–pipe』是利用了redis的管道傳輸,能極大的提公升效率
# '|'表示命令行管道符號,符號左側的輸出作為右側的輸入
如果要將mysql資料匯入redis,可以利用mysql語句拼湊出多條redis協議,再利用管道符號傳給redis處理。
首先寫好mysql語句,存入redis_protocol.sql中:
select
concat("*3\r\n","$4\r\nsadd\r\n","$4\r\nname\r\n","$",length(skey),"\r\n",skey,"\r")
from
(select `name` as skey from column) as t
在命令列執行:
mysql -uroot -ppwd -ddatabase --skip-column-names --raw < redis_protocol.sql | redis-cli --pipe
沒有報錯的話就可以了,再用redis-cli驗證一下是否成功。我試過14萬條資料匯入只需一兩秒,速度非常快。
三 . 附上乙份python實現的**
# coding:utf-8
import subprocess
import redis
import pymysql
dbconfig =
connection = pymysql.connect(**dbconfig)
cursor = connection.cursor()
# 方法一,拼湊redis協議使用命令列操作
def use_cmd():
cursor.execute(
"""select concat("*3\r\n","$4\r\nsadd\r\n","$4\r\nnames\r\n","$",length(skey),"\r\n",skey,"\r")
from (select `name` as skey from column) as t;
""") for redis_protocol in cursor.fetchall():
redis_protocol = redis_protocol.replace("\r", r"\r").replace('\n', r'\n') # 防止轉義
# 開啟子程序執行命令
sub = subprocess.popen(
r"echo -en '%s' | redis-cli --pipe -d 0 -a 945555" % redis_protocol,
shell=true, stdout=subprocess.pipe
)std = sub.communicate() # 獲取輸出,格式為[stdout, stderr]
print(std[0].decode('gbk'))
# 方法二,使用redis庫封裝的pipeline方法
def use_package():
cursor.execute('select `name` from ic_basic')
redis_con = redis.redis(host="127.0.0.1", port=6379, db=0, decode_responses=true)
p = redis_con.pipeline()
for record in cursor.fetchall():
name = record[0]
p.sadd('names', name)
replies = p.execute()
print(replies)
MYSQL快速同步資料到Redis
舉例場景 儲存遊戲玩家的任務資料,遊戲伺服器啟動時將mysql中玩家的資料同步到redis中。當然你可以如下思路 今天我們用linux系統終端執行該shell指令碼或者直接執行該系統命令,即可將mysql資料庫game db的表table mission資料同步到redis中鍵missions中去。...
MYSQL快速同步資料到Redis
舉例場景 儲存遊戲玩家的任務資料,遊戲伺服器啟動時將mysql中玩家的資料同步到redis中。從mysql中將資料匯入到redis的hash結構中。當然,最直接的做法就是遍歷mysql資料,一條一條寫入到redis中。這樣沒什麼錯,但是速度會非常慢。如果能夠想法使得mysql的查詢輸出資料直接能夠與...
Oracle同步資料到MySQL
oracle同步資料到mysql 1 首先在treesoft資料庫中配置兩個資料來源資訊 2 配置資料同步任務,並執行任務 3 同步結果資料檢視確認 4 目前treesoft支援以下資料同步方案 1 mysql同步資料到oracl 2 mysql同步資料到postgresql 3 mysql同步資料...