當前位置:首頁 » 數據倉庫 » 資料庫非同步存儲
擴展閱讀
前端星空背景 2022-08-16 11:16:26
蘋果緩存音頻 2022-08-16 11:16:08

資料庫非同步存儲

發布時間: 2022-08-06 23:19:03

A. 在php中如何向資料庫中非同步插入圖片

一般不向資料庫插入圖片 而是插入圖片的src 通過src找到圖片然後顯示。
(更多非同步問題http://bbs.hounwang.com)
<?php
session_start();
//array數組中放圖片的格式
$uptypes = array("image/jpg","image/jpeg","image/png","image/pjpeg","image/gif","image/bmp","image/x-png");
$files =$_FILES["uppic"];
if($files["size"]>2097152){ //圖片大小判斷
echo "上傳圖片不能大於2M";
echo "<meta http-equiv='REFRESH' CONTENT='1;URL=pic.php'>";
exit;
}
$ftype =$files["type"];
if(!in_array($ftype,$uptypes)){ //圖片格式判斷
echo "上傳的圖片文件格式不正確";
echo "<meta http-equiv='REFRESH' CONTENT='1;URL=pic.php'>";
}
$fname = $files["tmp_name"]; //在伺服器臨時存儲名稱
$image_info = getimagesize($fname);
$name = $files["name"];
$str_name = pathinfo($name); //以數組的形式返迴文件路勁的信息
$extname = strtolower($str_name["extension"]); //把字元串改為小寫 extensiorn擴展名
$upload_dir = "upload/"; //upload文件夾
$file_name = date("YmdHis").rand(1000,9999).".".$extname;
$str_file = $upload_dir.$file_name; //文件目錄
//存入資料庫
$con=mysql_connect("localhost","root","");
if(!$con){
die(("資料庫連接失敗").mysql_error());
}
mysql_select_db("mywork",$con);
$sql="update user set picpath='$str_file' where user_name='$username'"; //將圖片地址插入資料庫mywork
mysql_query($sql,$con);
mysql_close($con);
if(!file_exists($upload_dir)){
mkdir($upload_dir); //創建目錄 成功則返回true 失敗則返回flase
}
if(!move_uploaded_file($files["tmp_name"],$str_file)){ //將上傳的文件移動到新的目錄 要移動文件 和文件新目錄 成功則返回true
echo "圖片上傳失敗";
echo "<meta http-equiv='REFRESH' CONTENT='1;URL=插入失敗後希望跳轉的頁面>";
}
else{
//echo "<img src=".$str_file.">";
echo "圖片上傳成功";
echo "<meta http-equiv='REFRESH' CONTENT='1;URL=插入成功希望挑戰的頁面>";
}

B. php 如何非同步插入資料庫

頁面1.php裡面寫具體的執行語句
頁面2.php直接使用curl調用頁面1.php 並設置超時時間;根據你自己的需求寫但是你不一定如果超時時間內 資料庫沒執行玩 那你可能就獲取不到插入結果了
訪問2.php應該就是你說的非同步了

C. 資料庫寫操作 同步非同步什麼區別 什麼時候用同步 什麼時候用非同步

同步是指前台用戶操作的時候,後台資料庫也一起操作,一般用戶密碼等信息屬於同步操作。
非同步操作一般是指定時處理的一些東西,即前台操作完成之後,將進入到一個隊列,後台有隊列來輪詢處理,非同步操作多用於操作時間比較長,或者數據量非常大的時候。

D. 如何 用slf4j logback 把日誌非同步記錄到資料庫中

<!-- 將日誌存儲到oracle資料庫中 -->
<appender name="db-classic-oracle" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
<driverClass>oracle.jdbc.driver.OracleDriver</driverClass>
<url>jdbc:oracle:thin:@localhost:1521:ZYD</url>
<user>scott</user>
<password>tiger</password>
<sqlDialect class="ch.qos.logback.core.db.dialect.OracleDialect" />
</dataSource>
</connectionSource>
<sqlDialect class="ch.qos.logback.core.db.dialect.OracleDialect" />
</appender>

E. 玩家的游戲數據放在內存中,對資料庫做非同步更新。假如伺服器突然崩潰了,如何解決玩家數據丟失的問題

其實你問的這個問題難度真的很高……很多游戲開發商都沒解決這個問題,否則也不會有游戲伺服器出問題後,再登錄後發現自己的數據被回檔 的現象了。
這個事沒有純粹的技術型解決方案,只能靠人工勤於維護 盡量保證別崩潰、和增加伺服器集群的硬體性能,減少數據在內存的存放時間 盡快的保存到資料庫 等綜合性的辦法來解決。

F. 數據災備同步備份和非同步備份的區別

數據級容災:就是指建立一個異地的數據系統,該系統是本地關鍵應用數據的一個可用復制。在本地數據及整個應用系統出現災難時,至少在異地保存有一份可用的關鍵業務的數據。該數據可以是與本地生產數據的完全實時復制,也可以比本地數據略微落後,但一定是可用的。
應用級容災:在數據級容災基礎上,在異地建立一套與本地生產系統相當的備份環境,包括主機、網路、應用、IP等資源均有配套,當本地系統發生災難時,異地系統可以提供完全可用的生產環境。
數據級災備是應用級災備的基礎,應用級災備是數據級災備的升級版,兩者最主要的區別在於應用級災備在數據級災備的基礎上還能夠保障業務連續性。尤其是近年來優勢明顯的CDP容災備份技術,和力記易以CDP持續數據保護技術為核心,可以構建異地桌面端或伺服器端的文件、資料庫和應用的全需求平台,能夠防範數據丟失、修復數據錯誤,還能保障業務連續,全方位滿足客戶不同的數據安全和業務連續性要求。

G. 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基本可以瞬時完成。

H. 變動的數據如何實時保存資料庫

數據傳輸(DataTransmission)支持以資料庫為核心的結構化存儲產品之間的數據傳輸。
它是一種集數據遷移、數據訂閱及數據實時同步於一體的數據傳輸服務。數據傳輸致力於在公有雲、混合雲場景下,解決遠距離、毫秒級非同步數據傳輸難題。1.在分析型資料庫上創建目標表,數據更新類型為實時寫入,欄位名稱和MySQL中的建議均相同,欄位類型的映射見本文檔2.2節。2.在阿里雲數據傳輸的控制台上創建數據訂閱通道,並記錄這個通道的ID。3.配置dts-ads-writer/app.conf文件,配置方式如下:所有配置均保存在app.conf中,運行前請保證配確。修改配置後,請重啟write。
在您RDSforMySQL所在的雲賬號下開通阿里雲數據傳輸服務。並點擊此處下載dts-ads-writer插件到您的一台伺服器上並解壓(需要該伺服器可以訪問互聯網,建議使用阿里雲ECS以最大限度保障可用性)。伺服器上需要有Java6或以上的運行環境(JRE/JDK)。

I. 非同步寫資料庫是怎麼個非同步法

緩存 資料庫應該不致一台,還有個情況,聽說有的是採用非同步寫入,先接收相應的事務,然後再訪問資料庫寫入,具體搶購這個問題每個公司可能處理不一樣,

J. tornado資料庫操作怎麼非同步

一直以來的觀點是, 如果資料庫(本地或者在區域網內)的操作時間過長, 那麼需要優化的是資料庫, 以及聯合查詢, 另外該用NoSQL的用NoSQL, 該做cache的做cache ...

剛剛想到一個方法, 用tornado畢竟是可以做非同步request的, 如果你的資料庫真的很慢, 不如再開其他的tornado做block資料庫操作(你可以用tornado wsgi多線程/多進程形式部署, 也可以用django, flask等), 然後通過API的形式將資料庫返回過來. 相當於用tornado給你的資料庫操作web化(寫內部數據API)

這個是我剛才剛剛想到的, 原理就是用一些獨立的進程去做費時的資料庫操作, 這樣你的主web tornado進程就可以非同步暢通, 增加吞吐量. 這樣就不需要為各個資料庫寫驅動了.

如果資料庫在不同的機器上, 那麼可以考慮將這些獨立的數據操作tornado進程在資料庫機器上部署. 使用wsgi多線程/多進程的好處是查詢可以同時進行, 當然也可能卡死資料庫. 使用tornado自己的單進程非同步部署的時候, tornado還可以充當一個資料庫操作隊列的作用.

奇思妙想, 還沒有經過實踐.