標籤:
系統開發中時常會需要緩衝來提升並發讀的能力,這時可以通過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的複製