1. 程式人生 > >Redis 學習筆記四 Mysql 與Redis的同步實踐

Redis 學習筆記四 Mysql 與Redis的同步實踐

一、測試環境在Ubuntu kylin 14.04 64bit

已經安裝Mysql、Redis、php、lib_mysqludf_json.so、Gearman。
點選這裡檢視測試資料庫及表參考
本文也有些基本操作,在之前文章裡有介紹。

1、安裝

安裝gearman-mysql-udf

apt-get install libgearman-dev
wget https://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gz
tar -xzf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6
./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib/mysql/plugin/
make
sudo make install

註冊UDF函式:

CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';
CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';
CREATE FUNCTION gman_do RETURNS STRING SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_high RETURNS STRING SONAME "libgearman_mysql_udf.so"; 
CREATE FUNCTION gman_do_low RETURNS STRING SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_background RETURNS STRING SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_high_background RETURNS STRING SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_do_low_background RETURNS STRING SONAME "libgearman_mysql_udf.so";
CREATE AGGREGATE FUNCTION gman_sum RETURNS INTEGER SONAME "libgearman_mysql_udf.so";
CREATE FUNCTION gman_servers_set RETURNS STRING SONAME "libgearman_mysql_udf.so";

指定Gearman伺服器的資訊:

SELECT gman_servers_set('127.0.0.1:4730');

使用示例:

<?php
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "my_reverse_function");
while ($worker->work());

function my_reverse_function($job){
  return strrev($job->workload());
}
?>

輸入命令php reverse.php執行。

到mysql裡,輸入:

SELECT gman_do("reverse",'abcdef') AS test FROM Users; ---FROM Users也可以不帶。

這裡寫圖片描述

SELECT gman_do("reverse", password) AS test FROM Users;

可以看到輸出結果,其中password列已經被reverse的worker處理,mysql這時充當client端:

這裡寫圖片描述

還可以輸入以下命令測試:

SELECT gman_do_high("reverse", password) AS test FROM Users; --高優先權

這裡寫圖片描述

SELECT gman_do_background("reverse", password) AS test FROM Users; --後臺低優先權,返回主機和作業號。

這裡寫圖片描述

建立syncToRedis作業

停止前面的reverse worker,建立一個syncToRedis.php

    <?php
    ini_set('default_socket_timeout', -1); //很重要,否則可能報RedisException with message read error on connection ...
    $worker = new GearmanWorker();
    $worker->addServer();
    $worker->addFunction('syncToRedis', 'syncToRedis');

    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    echo("begin:\n");

    while($worker->work());
    function syncToRedis($job)
    {
            global $redis;
            $workString = $job->workload();
            $work = json_decode($workString);
            echo('get value:');
            echo($workString);
            echo("\n");
            echo('json_decode:');
            var_dump($work);
            echo("\n");
            if(!isset($work->user_id)){
                    return false;
            }
            $redis->set($work->user_id, $workString);
    }

在mysql裡測試一下:

    SELECT gman_do("syncToRedis", json_object(user_id as user_id,password as password)) AS test FROM Users;

這裡寫圖片描述

如果redis監控是開啟的,可以看到redis已經收到了資料:
這裡寫圖片描述

redis查詢結果
這裡寫圖片描述

2、建立觸發器

    DELIMITER $$
	CREATE TRIGGER datatoredis AFTER UPDATE ON Users
	  FOR EACH ROW BEGIN
	    SET @ret=gman_do_background('syncToRedis', json_object(NEW.user_id as `user_id`, NEW.email as `email`,NEW.display_name as `display_name`,NEW.password as `password`));  
	  END$$
DELIMITER ;

執行SQL語句測試:

insert into Users values('8','new','3','hello');
update Users set email='[email protected]' where user_id=8;

這裡寫圖片描述

正常使用時,可以把worker使用&設定為後臺任務:
nohup php syncToReids.php &

其它問題

有的時候,命令列執行php語句時可能會提示下面的錯誤,

[[email protected] redis]# php syncToRedis.php PHP Fatal error: Class ‘Redis’ not found in /home/wwwroot/default/youai/php/redis/syncToRedis.php on line 6
處理方法:
執行php命令和apache或ngnix可能使用了不同的php.ini,即使在php.ini裡看到載入了redis,還需要在php命令列使用php.ini裡也增加Redis模組。
檢視ngnix使用的php.ini位置使用

相關推薦

Redis 學習筆記 Mysql Redis同步實踐

一、測試環境在Ubuntu kylin 14.04 64bit 已經安裝Mysql、Redis、php、lib_mysqludf_json.so、Gearman。 點選這裡檢視測試資料庫及表參考 本文也有些基本操作,在之前文章裡有介紹。 1、安裝

StackExchange.Redis學習筆記() 事務控制和Batch批量操作

成了 pan arp 展示 關於 public 連續 因此 用戶 Redis事物 Redis命令實現事務 Redis的事物包含在multi和exec(執行)或者discard(回滾)命令中 和sql事務不同的是,Redis調用Exec只是將所有的命令變成一個單元一起執行,期

Spring Boot學習筆記——Spring BootRedis的集成

pac urn prope web property static 接口 per select 一.添加Redis緩存 1.添加Redis起步依賴 在pom.xml中添加Spring Boot支持Redis的依賴配置,具體如下: <dependency>

Redis 學習筆記(十三)Redis Sentinel 介紹部署

Redis Sentinel 介紹與部署 1. Sentinel介紹 1.1 主從複製的問題 Redis主從複製可將主節點資料同步給從節點,從節點此時有兩個作用: 一旦主節點宕機,從節點作為主節點的備份可以隨時頂上來。 擴充套件主節點的讀能力,

JAVA之 Redis 學習筆記(二) Redis的連線IP、埠號、連線密碼的修改以及JAVA簡單互動

一、專案中引入Redis包              根據上一篇文章中給的jar包路徑,將jar包下載,匯入自己的專案。(jedis-2.7.2.jar) 二、與Redis連線  (1)連線IP和埠

Redis學習筆記() Redis哨兵(sentinel)

Redis的哨兵(sentinel) 系統用於管理多個 Redis 伺服器,該系統執行以下三個任務: ·        監控(Monitoring): 哨兵(sentinel) 會不斷地檢查你的Master和Slave是否運作正常。 ·        提醒(Notifica

redis學習筆記(14)---redis基本命令總結

del diff lan 命令 列表 對象 很多 順序 reg http://doc.redisfans.com/ 網頁,對所有redis命令的用法與示例進行了詳細的描述 概述 Redis的鍵值可以使用物種數據類型:字符串,散列表,列表,集合,有序集合。本文詳細介紹這

Java多執行緒學習筆記() 使用ReentrantLock實現同步

1. 測試1 1.1 MyService import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MyService { pr

Redis學習筆記(一)---Redis的五種資料型別的簡單介紹和使用

1.準備工作:     1.1在Linux下安裝Redis    https://www.cnblogs.com/dddyyy/p/9763098.html    1.2啟動Redis     先把root/redis的redis.conf放到 /usr/local/redis/

Redis學習筆記(1)—— Redis簡介

一、NoSQL概述 1.1 什麼是NoSQL   NoSQL(NoSQL = Not Only SQL),意指“不僅僅是SQL”,是一項全新的資料庫理念,泛指非關係型的資料庫。 1.2 為什麼需要NoSQL   隨著網際網路web2.0網站的興起,非關係型的資料庫成了一個極其熱門的新領域,非關係型資料

Redis學習筆記(5)—— Redis的持久化方案&Redis的叢集搭建

一、Redis的持久化方案   Redis的高效能是由於其將所有資料都儲存在了記憶體中,為了使Redis在重啟之後仍能保證資料不丟失,需要將資料從記憶體中同步到硬碟中,這一過程就是持久化。        Redis支援兩種方式的持久化,一種是RDB方式,一種是AOF

Redis 學習筆記(1)—— Redis安裝,String 型別測試

1 Redis 介紹 1.1 概述 Redis是一個開源,先進的key-value儲存,並用於構建高效能,可擴充套件的應用程式的完美解決方案。 Redis資料庫完全在記憶體中,使用磁碟僅用於永續性。 相比許多鍵值資料儲存,Redis擁有一套較為豐富的資料型別。

Redis 學習筆記(3)—— Redis List 型別

1 Redis List 型別 1.1 案例1 package mylist; import redis.clients.jedis.BinaryClient; import redis.clients.jedis.Jedis; import java.ut

Redis 學習筆記(5)—— Redis sortSet 型別

1 sortSet 1.1 案例1 package sortset; import redis.clients.jedis.Jedis; import java.util.Set; public

9.0 redis儲存圖片+SpringDataRedis+mysqlredis的統一性

1.關於廣告業務表的設計: 關於那個網站的首頁都是廣告,廣告顯示需是動態顯示,然後我們引用了輪播圖設計。 這輪播圖表就是tb_content 關於這個每張輪播圖的表的設計擁有的屬性: id、title(每張圖片都一自己的title)、sort_order、pic_path、url

Redis學習筆記之十:Redis用作訊息佇列

package org.yamikaze.redis.messsage.subscribe; import org.yamikaze.redis.test.MyJedisFactory; import redis.clients.jedis.Jedis; import redis.clients.jedis

Redis學習筆記~是時候為Redis實現一個倉儲了,RedisRepository來了

回到目錄 之前寫了不少關於倉儲的文章,所以,自己習慣把自己叫倉儲大叔,上次寫的XMLRepository得到了大家的好評,也有不少朋友給我發email,進行一些知識的探討,今天主要來實現一個RedisRepository,它始終是整合IRepository介面的,我這裡的Redis倉儲主要服務為複雜型別的業

Redis學習筆記(二)——Redis資料型別

歡迎訪問:zrxJuly’s Bolg Redis支援5種資料型別: - string:字串 - hash:雜湊 - list:列表 - set: 集合 - zset:有序集合(sorted set) String:字串 string是Red

Redis學習筆記之二:Redis的資料儲存結構

Redis與Mysql等關係型資料庫的第一點區別就是Redis的資料儲存結構,Mysql等關係型資料庫以表的形式存放資料,而Redis提供Key-Value形式的儲存格式。與Mysql等資料庫的第二

Redis學習筆記(八)redis之lua指令碼學習

redis系列文章目錄 在實際工作過程中,可以使用lua指令碼來解決一些需要保證原子性的問題,而且lua指令碼可以快取在redis伺服器上,勢必會增加效能。 不過lua也會有很多限制,在使用的時候要注意。 demo /** * lu