導航:首頁 > 編程語言 > phpredismysql

phpredismysql

發布時間:2022-04-17 11:45:18

Ⅰ docker中獨立的nginx,php,mysql,redis 怎麼互聯

主機連接到mysql伺服器的話。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

Ⅱ php redis做mysql的緩存,怎麼非同步redis同步到mysql資料庫

對於變化頻率非常快的數據來說,如果還選擇傳統的靜態緩存方式(Memocached、File System等)展示數據,可能在緩存的存取上會有很大的開銷,並不能很好的滿足需要,而Redis這樣基於內存的NoSQL資料庫,就非常適合擔任實時數據的容器。
但是往往又有數據可靠性的需求,採用MySQL作為數據存儲,不會因為內存問題而引起數據丟失,同時也可以利用關系資料庫的特性實現很多功能。
所以就會很自然的想到是否可以採用MySQL作為數據存儲引擎,Redis則作為Cache。而這種需求目前還沒有看到有特別成熟的解決方案或工具,因此採用Gearman+PHP+MySQL UDF的組合非同步實現MySQL到Redis的數據復制。
MySQL到Redis數據復制方案
無論MySQL還是Redis,自身都帶有數據同步的機制,比較常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog來實現的,這樣的數據復制其實還是一個非同步過程,只不過當伺服器都在同一內網時,非同步的延遲幾乎可以忽略。
那麼理論上也可以用同樣方式,分析MySQL的binlog文件並將數據插入Redis。但是這需要對binlog文件以及MySQL有非常深入的理解,同時由於binlog存在Statement/Row/Mixedlevel多種形式,分析binlog實現同步的工作量是非常大的。
因此這里選擇了一種開發成本更加低廉的方式,借用已經比較成熟的MySQL UDF,將MySQL數據首先放入Gearman中,然後通過一個自己編寫的PHP Gearman Worker,將數據同步到Redis。比分析binlog的方式增加了不少流程,但是實現成本更低,更容易操作。
Gearman的安裝與使用
Gearman是一個支持分布式的任務分發框架。設計簡潔,獲得了非常廣泛的支持。一個典型的Gearman應用包括以下這些部分:

Gearman Job Server:Gearman核心程序,需要編譯安裝並以守護進程形式運行在後台
Gearman Client:可以理解為任務的收件員,比如在後台執行一個發送郵件的任務,可以在程序中調用一個Gearman Client並傳入郵件的信息,然後就可以將執行結果立即展示給用戶,而任務本身會慢慢在後台運行。
Gearman Worker:任務的真正執行者,一般需要自己編寫具體邏輯並通過守護進程方式運行,Gearman Worker接收到Gearman Client傳遞的任務內容後,會按順序處理。
以前曾經介紹過類似的後台任務處理項目Resque。兩者的設計其實非常接近,簡單可以類比為:
Gearman Job Server:對應Resque的Redis部分
Gearman Client:對應Resque的Queue操作
Gearman Worker:對應Resque的Worker和Job
這里之所以選擇Gearman而不是Resque是因為Gearman提供了比較好用的MySQL UDF,工作量更小。

安裝Gearman及PHP Gearman擴展
以下均以Ubuntu12.04為例。
apt-get install gearman gearman-server libgearman-dev

檢查Gearman的運行狀況:
/etc/init.d/gearman-job-server status
* gearmand is running

說明Gearman已經安裝成功。
PHP的Gearman擴展可以通過pecl直接安裝
pecl install gearman
echo "extension=gearman.so">/etc/php5/conf.d/gearman.ini
service php5-fpm restart

但是實測發現ubuntu默認安裝的gearman版本過低,直接運行pecl install gearman會報錯
configure: error: libgearman version 1.1.0or later required

因此Gearman + PHP擴展建議通過編譯方式安裝,這里為了簡單說明,選擇安裝舊版本擴展:
pecl install gearman-1.0.3

Gearman + PHP實例
為了更容易理解後文Gearman的運行流程,這里不妨從一個最簡單的Gearman實例來說明,比如要進行一個文件處理的操作,首先編寫一個Gearman Client並命名為client.php:
<?php
$client =newGearmanClient();
$client->addServer();
$client->doBackground('writeLog','Log content');
echo '文件已經在後台操作';

運行這個文件,相當於模擬用戶請求一個Web頁面後,將處理結束的信息返回用戶:
php client.php

查看一下Gearman的狀況:
(echo status ; sleep 0.1)| netcat127.0.0.14730

可以看到輸出為
writeLog 100.

說明已經在Gearman中建立了一個名為writeLog的任務,並且有1個任務在隊列等待中。
而上面的4列分別代表當前的Gearman的運行狀態:
任務名稱
在等待隊列中的任務
正在運行的任務
正在運行的Worker進程
可以使用watch進行實時監控:
watch -n 1"(echo status; sleep 0.1) | nc 127.0.0.1 4730"

然後我們需要編寫一個Gearman Worker命名為worker.php:
<?php
$worker =newGearmanWorker();
$worker->addServer();
$worker->addFunction('writeLog','writeLog');while($worker->work());function writeLog($job){
$log = $job->workload();file_put_contents(__DIR__ .'/gearman.log', $log ."\n", FILE_APPEND | LOCK_EX);}

Worker使用一個while死循環實現守護進程,運行
php worker.php

可以看到Gearman狀態變為:
writeLog 001

同時查看同目錄下gearman.log,內容應為從Client傳入的值Log content。
通過MySQL UDF + Trigger同步數據到Gearman
MySQL要實現與外部程序互通的最好方式還是通過MySQL UDF(MySQL user defined functions)來實現。為了讓MySQL能將數據傳入Gearman,這里使用了lib_mysqludf_json和gearman-mysql-udf的組合。
安裝lib_mysqludf_json
使用lib_mysqludf_json的原因是因為Gearman只接受字元串作為入口參數,可以通過lib_mysqludf_json將MySQL中的數據編碼為JSON字元串
apt-get install libmysqlclient-dev
wget https://github.com/mysqludf/lib_mysqludf_json/archive/master.zip
unzip master.zip
cd lib_mysqludf_json-master/
rm lib_mysqludf_json.so
gcc $(mysql_config --cflags)-shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

可以看到重新編譯生成了 lib_mysqludf_json.so 文件,此時需要查看MySQL的插件安裝路徑:
mysql -u root -pPASSWORD --execute="show variables like '%plugin%';"+---------------+------------------------+|Variable_name|Value|+---------------+------------------------+| plugin_dir |/usr/lib/mysql/plugin/|+---------------+------------------------+

然後將 lib_mysqludf_json.so 文件復制到對應位置:
cp lib_mysqludf_json.so /usr/lib/mysql/plugin/

最後登入MySQL運行語句注冊UDF函數:
CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';

安裝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 && make install

登入MySQL運行語句注冊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';

最後指定Gearman伺服器的信息:
SELECT gman_servers_set('127.0.0.1:4730');

通過MySQL觸發器實現數據同步
最終同步哪些數據,同步的條件,還是需要根據實際情況決定,比如將數據表data的數據在每次更新時同步,那麼編寫Trigger如下:
DELIMITER $$
CREATE TRIGGER datatoredis AFTER UPDATE ON data
FOR EACH ROW BEGIN
SET @ret=gman_do_background('syncToRedis', json_object(NEW.id as`id`, NEW.volume as`volume`));END$$
DELIMITER ;

嘗試在資料庫中更新一條數據查看Gearman是否生效。

Gearman PHP Worker將MySQL數據非同步復制到Redis
Redis作為時下當熱的NoSQL緩存解決方案無需過多介紹,其安裝及使用也非常簡單:
apt-get install redis-server
pecl install redis
echo "extension=redis.so">/etc/php5/conf.d/redis.ini

然後編寫一個Gearman Worker:redis_worker.php
#!/usr/bin/env php<?
$worker =newGearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis','syncToRedis');

$redis =newRedis();
$redis->connect('127.0.0.1',6379);while($worker->work());function syncToRedis($job){global $redis;
$workString = $job->workload();
$work = json_decode($workString);if(!isset($work->id)){returnfalse;}
$redis->set($work->id, $workString);}

最後需要將Worker在後台運行:
nohup php redis_worker.php &

通過這種方式將MySQL數據復制到Redis,經測試單Worker基本可以瞬時完成。

Ⅲ php中關於redis和資料庫

select 查詢的時候始終先查 redis 有沒有,沒有去查資料庫,再把結果緩存起來;
update 修改完資料庫內容後,同時對 redis 中緩存的數據做一下 update 更新操作,這樣 select 查詢 redis 的時候就是查詢的最新數據;
同理,delete、insert 操作資料庫後也要同時對 redis 中緩存的數據做 update 更新操作,這樣 select 查詢 redis 的時候就是查詢的最新數據;
這樣,所有的查詢操作就都是對 redis 做緩存讀取,可以緩解資料庫的壓力;

Ⅳ 如何使用redis做mysql的緩存

應用Redis實現數據的讀寫,同時利用隊列處理器定時將數據寫入MySQL。

同時要注意避免沖突,在redis啟動時去mysql讀取所有表鍵值存入redis中,往redis寫數據時,對redis主鍵自增並進行讀取,若mysql更新失敗,則需要及時清除緩存及同步redis主鍵。

這樣處理,主要是實時讀寫redis,而mysql數據則通過隊列非同步處理,緩解mysql壓力,不過這種方法應用場景主要基於高並發,而且redis的高可用集群架構相對更復雜,一般不是很推薦。

《內存資料庫和mysql的同步機制》

redis如何做到和mysql資料庫的同步

【方案一】http://www.hu.com/question/23401553?sort=created

程序實現mysql更新、添加、刪除就刪除redis數據。

程序查詢redis,不存在就查詢mysql並保存redis

redis和mysql數據的同步,代碼級別大致可以這樣做:

讀: 讀redis->沒有,讀mysql->把mysql數據寫回redis

寫: 寫mysql->成功,寫redis(捕捉所有mysql的修改,寫入和刪除事件,對redis進行操作)

【方案二】http://www.linuxidc.com/Linux/2015-01/380.htm

實時獲取mysql binlog進行解析,然後修改redis

MySQL到Redis數據方案

無論MySQL還是Redis,自身都帶有數據同步的機制,像比較常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog來實現的,這樣的數據其實還是一個非同步過程,只不過當伺服器都在同一內網時,非同步的延遲幾乎可以忽略。

那麼理論上我們也可以用同樣方式,分析MySQL的binlog文件並將數據插入Redis。但是這需要對binlog文件以及MySQL有非常深入的理解,同時由於binlog存在Statement/Row/Mixedlevel多種形式,分析binlog實現同步的工作量是非常大的。

因此這里選擇了一種開發成本更加低廉的方式,借用已經比較成熟的MySQL UDF,將MySQL數據首先放入Gearman中,然後通過一個自己編寫的PHP Gearman Worker,將數據同步到Redis。比分析binlog的方式增加了不少流程,但是實現成本更低,更容易操作。

【方案三】

使用mysql的udf,詳情請看MySQL :: MySQL 5.1 Reference Manual :: 22.3 Adding New Functions to MySQL 然後通過trigger在表update和insert之後進行函數的調用,寫入到redis中去。大致是這個樣子。

【http://www.hu.com/question/27738066】

1.首先明確是不是一定要上緩存,當前架構的瓶頸在哪裡,若瓶頸真是資料庫操作上,再繼續往下看。

2.明確memcached和redis的區別,到底要使用哪個。前者終究是個緩存,不可能永久保存數據(LRU機制),支持分布式,後者除了緩存的同時也支持把數據持久化到磁碟等,redis要自己去實現分布式緩存(貌似最新版本的已集成),自己去實現一致性hash。因為不知道你們的應用場景,不好說一定要用memcache還是redis,說不定用MongoDB會更好,比如在存儲日誌方面。

3.緩存量大但又不常變化的數據,比如評論。

4.你的思路是對的,清晰明了,讀DB前,先讀緩存,如果有直接返回,如果沒有再讀DB,然後寫入緩存層並返回。

5.考慮是否需要主從,讀寫分離,考慮是否分布式部署,考慮是否後續水平伸縮。

6.想要一勞永逸,後續維護和擴展方便,那就將現有的代碼架構優化,按你說的替換資料庫組件需要改動大量代碼,說明當前架構存在問題。可以利用現有的一些框架,比如SpringMVC,將你的應用層和業務層和資料庫層解耦。再上緩存之前把這些做好。

7.把讀取緩存等操作做成服務組件,對業務層提供服務,業務層對應用層提供服務。

8.保留原始資料庫組件,優化成服務組件,方便後續業務層靈活調用緩存或者是資料庫。

9.不建議一次性全量上緩存,最開始不動核心業務,可以將邊緣業務先換成緩存組件,一步步換至核心業務。

10.刷新內存,以memcached為例,新增,修改和刪除操作,一般採用lazy load的策略,即新增時只寫入資料庫,並不會馬上更新Memcached,而是等到再次讀取時才會載入到Memcached中,修改和刪除操作也是更新資料庫,然後將Memcached中的數據標記為失效,等待下次讀取時再載入。

Ⅳ php實現redis資料庫指定庫號遷移的方法

這篇文章主要介紹了php實現redis資料庫指定庫號遷移的方法,涉及對於redis資料庫的操作技巧,非常具有實用價值,需要的朋友可以參考下

本文實例講述了php實現redis資料庫指定庫號遷移的方法,分享給大家供大家參考。具體如下:
redis普通的資料庫遷移,只能整個redis
save,或者利用主從,當然也可以安裝一個redis-mp,不過比較麻煩,這里提供一種php的腳本,實現指定庫號的遷移,其實也就是遍歷根據存儲類型,讀出來,插入新庫,效果是這樣:
代碼如下:
[root@localhost
~]#
php
1.php
1/407
101/407
201/407
301/407
401/407
PHP實例代碼如下:
代碼如下:
<?php
$from
=
'10.0.2.52:6379/7';
$to
=
'127.0.0.1:6379/7';
$from_redis
=
redis_init($from);
$to_redis
=
redis_init($to);
$keys
=
$from_redis->keys('*');
$count
=
0;
$total
=
count($keys);
foreach($keys
as
$key){
if(++$count
%
100
==
1){
echo
"$count/$totaln";
}
$type
=
$from_redis->type($key);
switch($type){
case
Redis::REDIS_STRING:
$val
=
$from_redis->get($key);
$to_redis->set($key,
$val);
break;
case
Redis::REDIS_LIST:
$list
=
$from_redis->lRange($key,
0,
-1);
foreach($list
as
$val){
$to_redis->rPush($key,
$val);
}
break;
case
Redis::REDIS_HASH:
$hash
=
$from_redis->hGetAll($key);
$to_redis->hMSet($key,
$hash);
break;
case
Redis::REDIS_ZSET:
$zset
=
$from_redis->zRange($key,
0,
-1,
true);
foreach($zset
as
$val=>$score){
$to_redis->zAdd($key,
$score,
$val);
}
break;
}
}
function
redis_init($conf){
$redis
=
new
Redis();
preg_match('/^([^:]+)(:[0-9]+)?/(.+)?/',
$conf,
$ms);
$host
=
$ms[1];
$port
=
trim($ms[2],
':');
$db
=
$ms[3];
$redis->connect($host,
$port);
$redis->select($db);
return
$redis;
}
?>

希望本文所述對大家的php程序設計有所幫助。

Ⅵ php頻繁刷新網頁運行一段時間後出現資料庫連接錯誤

這是由於資料庫連接數過多導致的,說明之前建立的連接你沒有釋放。

看到你的需求是實時獲取資料庫裡面的內容,可以考慮使用內存資料庫,這樣返回的效率高,也會避免過多連接的錯誤。

可以使用redis和memcache來解決這個問題。代碼如下,記得首先要安裝redis,並且要安裝php-redis擴展。

<?php

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);//serverip port

$redis->auth('mypassword');//my redis password

$redis ->set( "test" , "Hello World");

echo $redis ->get( "test");

Ⅶ php redis怎麼存儲資料庫分頁數據

存儲在一個序列集合中,存儲數據ID就好了,然後可以正序,倒序,查詢,但是你想要加上條件查詢,需要做很多的索引。

Ⅷ thinkphp redis 怎麼選擇資料庫

1、redis 中的每一個資料庫,都由一個 redisDb 的結構存儲。其中,redisDb.id 存儲著 redis 資料庫以整數表示的號碼。redisDb.dict 存儲著該庫所有的鍵值對數據。redisDb.expires 保存著每一個鍵的過期時間。

2、當redis 伺服器初始化時,會預先分配 16 個資料庫(該數量可以通過配置文件配置),所有資料庫保存到結構 redisServer 的一個成員 redisServer.db 數組中。當我們選擇資料庫 select number 時,程序直接通過 redisServer.db[number] 來切換資料庫。有時候當程序需要知道自己是在哪個資料庫時,直接讀取 redisDb.id 即可。

3、既然我們知道一個資料庫的所有鍵值都存儲在redisDb.dict中,那麼我們要知道如果找到key的位置,就有必要了解一下dict 的結構了:

typedef struct dict {

// 特定於類型的處理函數
dictType *type;

// 類型處理函數的私有數據
void *privdata;

// 哈希表(2個)
dictht ht[2];

// 記錄 rehash 進度的標志,值為-1 表示 rehash 未進行
int rehashidx;

// 當前正在運作的安全迭代器數量
int iterators;
} dict;
由上述的結構可以看出,redis 的字典使用哈希表作為其底層實現。dict 類型使用的兩個指向哈希表的指針,其中 0 號哈希表(ht[0])主要用於存儲資料庫的所有鍵值,而1號哈希表主要用於程序對 0 號哈希表進行 rehash 時使用,rehash 一般是在添加新值時會觸發,這里不做過多的贅述。所以redis 中查找一個key,其實就是對進行該dict 結構中的 ht[0] 進行查找操作。

4、既然是哈希,那麼我們知道就會有哈希碰撞,那麼當多個鍵哈希之後為同一個值怎麼辦呢?redis採取鏈表的方式來存儲多個哈希碰撞的鍵。也就是說,當根據key的哈希值找到該列表後,如果列表的長度大於1,那麼我們需要遍歷該鏈表來找到我們所查找的key。當然,一般情況下鏈表長度都為是1,所以時間復雜度可看作o(1)。

二、當redis 拿到一個key 時,如果找到該key的位置。

了解了上述知識之後,我們就可以來分析redis如果在內存找到一個key了。

1、當拿到一個key後, redis 先判斷當前庫的0號哈希表是否為空,即:if (dict->ht[0].size == 0)。如果為true直接返回NULL。

2、判斷該0號哈希表是否需要rehash,因為如果在進行rehash,那麼兩個表中者有可能存儲該key。如果正在進行rehash,將調用一次_dictRehashStep方法,_dictRehashStep 用於對資料庫字典、以及哈希鍵的字典進行被動 rehash,這里不作贅述。

3、計算哈希表,根據當前字典與key進行哈希值的計算。

4、根據哈希值與當前字典計算哈希表的索引值。

5、根據索引值在哈希表中取出鏈表,遍歷該鏈表找到key的位置。一般情況,該鏈表長度為1。

6、當 ht[0] 查找完了之後,再進行了次rehash判斷,如果未在rehashing,則直接結束,否則對ht[1]重復345步驟。

到此我們就找到了key在內存中的位置了。

Ⅸ php 使用redis有什麼用

速度可以提高很多,因為PHP太過於依賴MYSQL,但是MYSQL連接和讀取又浪費太多時間,導致請求非常的慢,知道電腦原理就知道,讀取數據,最快的是內存,然後是硬碟。REDIS相當於把數據放在內存里,所以不用MYSQL,而且是在內存里讀取更快。

java怎麼使用redis進行mysql數據的緩存

方法有很多
其中之一
實時獲取mysql
binlog進行解析
然後修改redis
MySQL到Redis數據方案
無論MySQL還是Redis
自身都帶有數據同步的機制,像比較常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog來實現的,這樣的數據其實還是一個非同步過程,只不過當伺服器都在同一內網時,非同步的延遲幾乎可以忽略
那麼理論上我們也可以用同樣方式,分析MySQL的binlog文件並將數據插入Redis。但是這需要對binlog文件以及MySQL有非常深入的理解,同時由於binlog存在Statement/Row/Mixedlevel多種形式,分析binlog實現同步的工作量是非常大的。
因此這里選擇了一種開發成本更加低廉的方式,借用已經比較成熟的MySQL
UDF,將MySQL數據首先放入Gearman中,然後通過一個自己編寫的PHP
Gearman
Worker,將數據同步到Redis

閱讀全文

與phpredismysql相關的資料

熱點內容
php獨立運行 瀏覽:530
手機sh執行命令 瀏覽:727
雲伺服器的角色 瀏覽:733
單片機頻率比例 瀏覽:840
我的世界伺服器如何關閉正版驗證 瀏覽:504
如何查roid伺服器上的 瀏覽:130
安卓手機主板如何撬晶元不掉電 瀏覽:249
php各個框架的優缺點 瀏覽:101
php1100生成數組 瀏覽:359
以後做平面設計好還是程序員好 瀏覽:552
雲伺服器應用管理 瀏覽:438
飢荒雲伺服器搭建過程 瀏覽:186
可編程式控制制器優點 瀏覽:99
壓縮垃圾車說明書 瀏覽:28
五輪書pdf 瀏覽:802
單片機定時流水中斷系統流水燈 瀏覽:701
u8如何連接伺服器配置 瀏覽:68
動力在於緩解壓力 瀏覽:867
報考科一用什麼app 瀏覽:346
knn人臉識別演算法 瀏覽:431