mysql到redis的複製

來源:互聯網
上載者:User

標籤:

系統開發中時常會需要緩衝來提升並發讀的能力,這時可以通過mysql的UDF和hiredis來進行同步 


前題:安裝了mysql5.6和client ,開發環境window7 32、vs2013

1、安裝redis 和 hiredis 

GitHub上的MSOpenTech/redis項目地址

具體編譯安裝方法可以查看

http://www.cnblogs.com/raker/p/4368741.html


2、下載安裝mysql2redis 
https://github.com/dawnbreaks/mysql2redis

這裡有個問題,由於github上的mysql2redis 是為linux系統寫的一個安裝項目,所以我們在這裡不能直接用,只需要

解壓後根目錄的src檔案夾裡面的源檔案就OK了。

 

3、部署mysql動態連結程式庫

  

首先開啟VS建立一個win32動態連結程式庫工程,選空項目,工程名為my_udf(名字隨意)

再建立一個source file,準備好一下庫:

1.mysql庫檔案(安裝mysql的時候選擇安裝開發包,在mysql根目錄下就有)

2.mysql2redis裡面的src源檔案

3.hiredis庫檔案(在source file建立一個hiredis檔案夾):

  • 在hiredis下建立個lib檔案夾把在上面第一步下載的redis檔案裡面,msvs檔案下編譯出來的debug檔案下找出hiredis.lib和Win32_Interop.lib拷貝進去
  • 把redis跟目錄下的deps裡的hiredis檔案夾拷貝到hiredis下
  • 最後把redis 下的src檔案夾也拷貝過來,然後進入src裡面打除了fmacros.h檔案和Win32_Interop檔案夾的其他檔案刪除掉

 

4.在項目設定裡面匯入各個庫

ps:記得要載入2個LIB庫

// 項目->屬性->連結器->輸入->附加依賴項->Win32_Interop.lib; hiredis.lib;
// #pragma comment(lib,"hiredis.lib")
// #pragma comment(lib,"Win32_Interop.lib")


然後將編譯產生的my_udf.dll拷貝到mysql的lib裡plugin下
在mysql裡執行下列語句載入方法

DROP FUNCTION IF EXISTS lib_mysqludf_redis_info;   #刪除DROP FUNCTION IF EXISTS redis_command;CREATE FUNCTION lib_mysqludf_redis_info RETURNS STRING SONAME ‘my_udf.dll‘;    #載入CREATE FUNCTION redis_command RETURNS INT SONAME ‘my_udf.dll‘;

 

 

5、在mysql裡建立table,trigger 
table:

CREATE  TABLE IF NOT EXISTS `test`.`my_test` (   `uid` int NULL ,   `name` VARCHAR(20) NOT NULL ,    `Money` INT NULL ,    PRIMARY KEY (`uid`) ,    ENGINE = InnoDB;  

 

trigger :

CREATE    /*!50017 DEFINER = ‘root‘@‘%‘ */    TRIGGER `tri_my_test_insert_redis` BEFORE INSERT ON `my_test`     FOR EACH ROW BEGIN    DECLARE done INT DEFAULT 999;    DECLARE inserId INT DEFAULT 0;    #Declare info char ;        #set info = CONCAT("{",CAST(new.uid AS CHAR),":",new.uid,",",CAST(new.Money AS CHAR),":",new.Money,"}");        #SET inserId = LAST_INSERT_ID()+1;
 
   SELECT MAX(uid)+1 INTO inserId FROM my_test; SET done = redis_command("127.0.0.1",6379,CONCAT( "set user::",inserId," ", CONCAT("{uid:",inserId,",name:",CAST(new.name AS CHAR),",Money:",new.Money,"}") ) ); IF done > 0 THEN # 45001 拋一個自訂異常終止操作 SIGNAL SQLSTATE ‘45001‘ SET message_text = "Redis error!"; END IF; END;$$DELIMITER ;

 

INSERT INTO my_test(NAME,Money) VALUES(‘Sally‘,1000)  



mysql的 
 

redis的 


使用mysql的udf和trigger可以保證mysql和redis的資料一致性,SIGNAL sqlstate ‘45001‘會在redis失敗時復原事物。 

問題:hiredis裡遞交帶空格資料需要這樣使用 

1.reply = redisCommand(context, "SET key:%s %s", myid, value);  


那麼對於mysql2redis的redis_command是無法工作的,這部分可以為不同命令單寫函數。如redis_command_set。 

mysql到redis的複製

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.