當前位置:首頁 » 硬碟大全 » 非同步讀緩存
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

非同步讀緩存

發布時間: 2022-05-07 18:45:41

1. 非同步串列通信必須設置緩存

非同步串列通信應該必須要設置緩存,設置緩存的話,你才能更好的找到他的東西,應該是能夠有基本的。操作。

2. 為什麼redis在java是同步緩存,而在nodejs是非同步緩存

JAVASCRIPT中是沒有多線程的,所有涉及外部IO的全部都是回調。
這樣的好處是JS天然就是一個不會阻塞的系統,這也是NODEJS現在作為前後端黏合層的原因。

3. 如何用C#實現文件的三種讀寫方式:無緩存,有緩存,非同步。最好有關鍵代碼

1、聲明並使用File的OpenRead實例化一個文件流對象,就像下面這樣

FileStream fs = File.OpenRead(filename);

或者

FileStream fs = FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);

2准備一個存放文件內容的位元組數組,fs.Length將得到文件的實際大小,就像下面這樣

byte[] data = new byte[fs.Length];

3開始讀了,調用一個文件流的一個方法讀取數據到data數組中

fs.Read (data, 0, data.Length);

清空這個data 就意味著沒有緩存. 不清空.. 這個DATA就用就是你的文件內容.
所謂非同步要看你怎麼個非同步想法.開線程? 還是?咋子?
代碼都一樣.

4. 什麼是非同步緩存

你好
同步指的是邊看邊緩存
非同步肯定是和他相反的
滿意採納下

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

6. 想了解緩存的概念

緩存
緩存就是指可以進行高速數據交換的存儲器,它先於內存與CPU交換數據,因此速度極快,所以又被稱為高速緩存。與處理器相關的緩存一般分為兩種——L1緩存,也稱內部緩存;和L2緩存,也稱外部緩存。例如Pentium4「Willamette」內核產品採用了423的針腳架構,具備400MHz的前端匯流排,擁有256KB全速二級緩存,8KB一級追蹤緩存,SSE2指令集。
內部緩存(L1 Cache)
也就是我們經常說的一級高速緩存。在CPU裡面內置了高速緩存可以提高CPU的運行效率,內置的L1高速緩存的容量和結構對CPU的性能影響較大,L1緩存越大,CPU工作時與存取速度較慢的L2緩存和內存間交換數據的次數越少,相對電腦的運算速度可以提高。不過高速緩沖存儲器均由靜態RAM組成,結構較復雜,在CPU管芯面積不能太大的情況下,L1級高速緩存的容量不可能做得太大,L1緩存的容量單位一般為KB。
外部緩存(L2 Cache)
CPU外部的高速緩存,外部緩存成本昂貴,所以Pentium 4 Willamette核心為外部緩存256K,但同樣核心的賽揚4代只有128K。

硬碟緩存越高,讀取速度越快

7. 分布式系統的非同步處理流程通常有哪些設計解決方案

開源軟體已經成為許多大型網站的基本組成部分,隨著這些網站的逐步壯大,他們的網站架構和一些指導原則也出現在開發者們的面前,給予切實有用的指導和幫助。本文旨在介紹一些核心問題以及通過構建模塊來製作大型網站,實現最終目標。 這篇文章主要側重於Web系統,並且也適用於其他分布式系統。 Web分布式系統設計的原則 構建並運營一個可伸縮的Web站點或應用程序到底指的是什麼?在最初,僅是通過互聯網連接用戶和訪問遠程資源。 和大多數事情一樣,當構建一個Web服務時,需要提前抽出時間進行規劃。了解大型網站創建背後的注意事項以及權衡可能會給你帶來更加明智的決策,當你在創建小網站時。下面是設計大型Web系統時,需要注意的一些核心原則: 1.可用性 2.性能 3.可靠性 4.可擴展 5.易管理 6.成本 上面的這些原則給設計分布式Web架構提供了一定的基礎和理論指導。然而,它們也可能彼此相左,例如實現這個目標的代價是犧牲成本。一個簡單的例子:選擇地址容量,僅通過添加更多的伺服器(可伸縮性),這個可能以易管理(你不得不操作額外的伺服器)和成本作為代價(伺服器價格)。 無論你想設計哪種類型的Web應用程序,這些原則都是非常重要的,甚至這些原則之間也會互相羈絆,做好它們之間的權衡也非常重要。 基礎 當涉及到系統架構問題時,這幾件事情是必須要考慮清楚的:什麼樣的模塊比較合適?如何把它們組合在一起?如何進行恰當地權衡?在擴大投資之前,它通常需要的並不是一個精明的商業命題,然而,一些深謀遠慮的設計可以幫你在未來節省大量的時間和資源。 討論的重點幾乎是構建所有大型Web應用程序的核心:服務、冗餘、分區和故障處理能力。這里的每個因素都會涉及到選擇和妥協,特別是前面所討論的那些原則。解釋這些核心的最佳辦法就是舉例子。 圖片託管應用程序 有時,你會在線上傳圖片,而一些大型網站需要託管和傳送大量的圖片,這對於構建一個具有成本效益、高可用性並具有低延時(快速檢索)的架構是一項挑戰。 在一個圖片系統中,用戶可以上傳圖片到一個中央伺服器里,通過網路連接或API對這些圖片進行請求,就像Flickr或者Picasa。簡單點,我們就假設這個應用程序只包含兩個核心部分:上傳(寫)圖片和檢索圖片。圖片上傳時最好能夠做到高效,傳輸速度也是我們最關心的,當有人向圖片發出請求時(例如是一個Web頁面或其他應用程序)。這是非常相似的功能,提供Web服務或內容分發網路(一個CDN伺服器可以在許多地方存儲內容,所以無論是在地理上還是物理上都更加接近用戶,從而導致更快的性能)邊緣伺服器。 該系統需要考慮的其他重要方面: 1.圖片存儲的數量是沒有限制的,所以存儲應具備可伸縮,另外圖片計算也需要考慮 2.下載/請求需要做到低延遲 3.用戶上傳一張圖片,那麼圖片就應該始終在那裡(圖片數據的可靠性) 4.系統應該易於維護(易管理) 5.由於圖片託管不會有太高的利潤空間,所以系統需要具備成本效益 圖1是個簡化的功能圖 圖1 圖片託管系統的簡化結構圖 在這個例子中,系統必須具備快速、數據存儲必須做到可靠和高度可擴展。構建一個小型的應用程序就微不足道了,一台伺服器即可實現託管。如果這樣,這篇文章就毫無興趣和吸引力了。假設我們要做的應用程序會逐漸成長成Flickr那麼大。 服務 當我們考慮構建可伸縮的系統時,它應有助於解耦功能,系統的每個部分都可以作為自己的服務並且擁有清晰的介面定義。在實踐中,這種系統設計被稱作面向服務的體系結構(SOA)。對於此類系統,每個服務都有它自己的獨特功能,通過一個抽象介面可以與外面的任何內容進行互動,通常是面向公眾的另一個服務 API。 把系統分解成一組互補性的服務,在互相解耦這些操作塊。這種抽象有助於在服務、基本環境和消費者服務之間建立非常清晰的關系。這種分解可以有效地隔離問題,每個塊也可以互相伸縮。這種面向服務的系統設計與面向對象設計非常相似。 在我們的例子中,所有上傳和檢索請求都在同一台伺服器上處理。然而,因為系統需要具備可伸縮性,所以把這兩個功能打破並集成到自己的服務中是有意義的。 快進並假設服務正在大量使用;在這種情況下,很容易看到寫圖片的時間對讀圖片時間有多大影響(他們兩個功能在彼此競爭共享資源)。根據各自體系,這種影響會是巨大的。即使上傳和下載速度相同(這是不可能的,對於大多數的IP網路來說,下載速度:上傳速度至少是3:1),通常,文件可以從緩存中讀取,而寫入,最終是寫到磁碟中(也許在最終一致的情況下,可以被多寫幾次)。即使是從緩存或者磁碟(類似SSD)中讀取,數據寫入都會比讀慢(Pole Position,一個開源DB基準的開源工具和結果)。 這種設計的另一個潛在問題是像Apache或者Lighttpd這些Web伺服器通常都會有一個並發連接數上限(默認是500,但也可以更多),這可能會花費高流量,寫可能會迅速消掉所有。既然讀可以非同步或利用其他性能優化,比如gzip壓縮或分塊傳輸代碼,Web服務可以快速切換讀取和客戶端來服務於更多的請求,超過每秒的最大連接數(Apache的最大連接數設置為500,這種情況並不常見,每秒可以服務幾千個讀取請求)。另一方面,寫通常傾向於保持一個開放的鏈接進行持續上傳,所以,使用家庭網路上傳一個1 MB的文件花費的時間可能會超過1秒,所以,這樣的伺服器只能同時滿足500個寫請求。 圖2:讀取分離 規劃這種瓶頸的一個非常好的做法是把讀和寫進行分離,如圖2所示。這樣我們就可以對它們單獨進行擴展(一直以來讀都比寫多)但也有助於弄明白每個點的意思。這種分離更易於排除故障和解決規模方面問題,如慢讀。 這種方法的優點就是我們能夠彼此獨立解決問題——在同種情況下,無需寫入和檢索操作。這兩種服務仍然利用全球語料庫的圖像,但是他們可以自由地優化性能和服務方法(例如排隊請求或者緩存流行圖片——下面會介紹更多)。從維護和成本角度來看,每一個服務都可以根據需要獨立進行擴展,但如果把它們進行合並或交織在一起,那麼有可能無意中就會對另一個性能產生影響,如上面討論的情景。 當然,如果你有兩個不同的端點,上面的例子可能會運行的很好(事實上,這非常類似於幾個雲存儲供應商之間的實現和內容分發網路)。雖然有很多種方法可以解決這些瓶頸,但每個人都會有不同的權衡,所以採用適合你的方法才是最重要的。 例如,Flickr解決這個讀/寫問題是通過分發用戶跨越不同的碎片,每個碎片只能處理一組用戶,但是隨著用戶數的增加,更多的碎片也會相應的添加到群集里(請參閱Flickr的擴展介紹)。在第一個例子中,它更容易基於硬體的實際用量進行擴展(在整個系統中的讀/寫數量),而Flickr是基於其用戶群進行擴展(but forces the assumption of equal usage across users so there can be extra capacity)。而前面的那個例子,任何一個中斷或者問題都會降低整個系統功能(例如任何人都沒辦法執行寫操作),而Flickr的一個中斷只會影響到其所在碎片的用戶數。在第一個例子中,它更容易通過整個數據集進行操作——例如,更新寫服務,包括新的元數據或者通過所有的圖片元數據進行搜索——而 Flickr架構的每個碎片都需要被更新或搜索(或者需要創建一個搜索服務來收集元數據——事實上,他們就是這樣做的)。 當談到這些系統時,其實並沒有非常正確的答案,但有助於我們回到文章開始處的原則上看問題。確定系統需求(大量的讀或寫或者兩個都進行、級別並發、跨數據查詢、范圍、種類等等),選擇不同的基準、理解系統是如何出錯的並且對以後的故障發生情況做些扎實的計劃。 冗餘 為了可以正確處理錯誤,一個Web架構的服務和數據必須具備適當的冗餘。例如,如果只有一個副本文件存儲在這台單獨的伺服器上,那麼如果這台伺服器出現問題或丟失,那麼該文件也隨即一起丟失。丟失數據並不是什麼好事情,避免數據丟失的常用方法就是多創建幾個文件或副本或冗餘。 同樣也適用於伺服器。如果一個應用程序有個核心功能,應確保有多個副本或版本在同時運行,這樣可以避免單節點失敗。 在系統中創建冗餘,當系統發生危機時,如果需要,可以消除單點故障並提供備份或備用功能。例如,這里有兩個相同的服務示例在生產環境中運行,如果其中一個發生故障或者降低,那麼該系統容錯轉移至那個健康的副本上。容錯轉移可以自動發生也可以手動干預。 服務冗餘的另一重要組成部分是創建一個無共享架構。在這種體系結構中,每個節點都能相互獨立運行,並且沒有所謂的中央“大腦”管理狀態或協調活動其他節點。這對系統的可擴展幫助很大,因為新節點在沒有特殊要求或知識的前提下被添加。然而,最重要的是,這些系統是沒有單點故障的,所以失敗的彈性就更大。 例如在我們的圖片伺服器應用程序中,所有的圖片在另一個硬體上都有冗餘副本(理想情況下是在不同的地理位置,避免在數據中心發生一些火災、地震等自然事故),服務去訪問圖片將被冗餘,所有潛在的服務請求。(參見圖3:採用負載均衡是實現這點的最好方法,在下面還會介紹更多方法) 圖3 圖片託管應用程序冗餘 分區 數據集有可能非常大,無法安裝在一台伺服器上。也有可能這樣,某操作需要太多的計算資源、性能降低並且有必要增加容量。在這兩種情況下,你有兩種選擇:縱向擴展或橫向擴展。 縱向擴展意味著在單個伺服器上添加更多的資源。所以,對於一個非常大的數據集來說,這可能意味著添加更多(或更大)的硬體設備,來使一台伺服器能容下整個數據集。在計算操作下,這可能意味著移動計算到一個更大的伺服器上,擁有更快的CPU或更大的內存。在各種情況下,縱向擴展可以通過提升單個資源的處理能力來完成。 橫向擴展在另一方面是添加更多的節點,在大數據集下,這可能會使用第二伺服器來存儲部分數據集,對於計算資源來說,這意味著分割操作或跨節點載入。為了充分利用橫向擴展,它應作為一種內在的系統架構設計原則,否則修改或拆分操作將會非常麻煩。 當談到橫向擴展時,最常見的做法是把服務進行分區或碎片。分區可以被派發,這樣每個邏輯組的功能就是獨立的。可以通過地理界限或其他標准,如非付費與付費用戶來完成分區。這些方案的優點是他們會隨著容量的增加提供一個服務或數據存儲。 在我們的圖片伺服器案例中,用來存儲圖片的單個文件伺服器可能被多個文件伺服器取代,每個裡面都會包含一套自己獨特的圖像。(見圖4)這種架構將允許系統來填充每一個文件/圖片伺服器,當磁碟填滿時會添加額外的伺服器。這樣的設計需要一個命名方案,用來捆綁圖片文件名到其相應的伺服器上。圖像名字可以形成一個一致的哈希方案並映射到整個伺服器上;或者給每張圖片分配一個增量ID,當客戶端對圖片發出請求時,圖片檢索服務只需要檢索映射到每個伺服器上(例如索引)的ID。 圖4 圖片託管應用程序冗餘和分區 當然,跨越多個伺服器對數據或功能進行分區還是有許多挑戰的。其中的關鍵問題是數據本地化。在分布式系統中,數據操作或計算點越接近,系統性能就會越好。因此,它也可能是個潛在問題,當數據分散在多個伺服器上時。有時數據不是在本地,那麼就要迫使伺服器通過網路來獲取所需的信息,這個獲取的過程就會設計到成本。 另一潛在問題是不一致。當這里有多個服務對一個共享資源執行讀寫操作時,潛在可能會有另一個伺服器或數據存儲參與進來,作為競選條件——一些數據需要更新,但是讀的優先順序高於更新——在這種情況下,數據就是不一致的。例如在圖片託管方案中,有可能出現的不一致是:如果一個客戶端發送更新“狗”圖片請求,進行重新命名,把“Dog”改成“Gizmo”,但同時,另一個客戶端正在讀這張圖片。在這種情況下,標題就是不清楚的。“Dog”或“Gizmo” 應該被第二個客戶端接收。 當然,在進行數據分區時會產生一些障礙,但是分區允許把每個問題拆分到管理群里——通過數據、負載、使用模式等。這樣對可擴展和易管理都是有幫助的,但也不是沒有風險的。這里有很多方式來降低風險和故障處理;然而,為了簡便起見,並未在本文中詳細說明,如果你有興趣,可以訪問我的博客。 總結 以上介紹的都是設計分布式系統需要考慮的核心要素。可用性、性能、可靠性、可擴展、易管理、成本這幾個原則非常重要,但在實際應用中可能會以犧牲某個原則來實現另外一個原則,在這個過程中就要做好權衡工作,做到因時制宜。 在下面的構建分布式系統實戰中,我們將會深入介紹如何設計可擴展的數據訪問,包括負載均衡、代理、全局緩存、分布式緩存等。 英文地址:Dr.Dobb's 文:CSDN

8. 同步fifo和非同步fifo的區別

當你的設計中只有一個時鍾信號的時候,所有的寄存器都使用同一個時鍾,他們之間不會產生傳輸速度不匹配的情況;而當你的設計中存在多個時鍾信號,並且需要在這幾個時鍾域之間傳輸數據的時候,寄存器會由於時鍾信號的頻率不匹配而產生數據丟失等情況,這個時候需要用非同步FIFO來進行緩存,保證數據能夠正確傳輸,因此一般非同步FIFO會包含一個雙埠的RAM,用於數據記錄,詳細地可以參考FIFO的相關資料。這里的非同步指的是不同頻率/不同相位的時鍾信號。而同步FIFO一般只用來作buffer。
大概就是這樣子。
2.FIFO是不會實現數據位數的變換的。它只是實現了數據能被正確的傳遞。
同步就不用說了,非同步時,當寫滿和讀空時都有相應的信號告訴發送和接受模塊,
這樣就不會用沖突了

9. C# NetworkStream非同步讀數據怎麼知道已經讀完了

面的情況,我們就可以定義這樣一個協議:

[length=XXX]:其中xxx是實際發送的字元串長度(注意不是位元組數組buffer的長度),那麼對於上面的請求,則我們發送的數據為:「[length=4] adc!」。而服務端接收字元串之後,首先讀取這個「元數據」的內容,然後再根據「元數據」內容來讀取實際的數據

「[「」]」中括弧是完整的,可以讀取到length的位元組數。然後根據這個數值與後面的字元串長度相比,如果相等,則說明發來了一條完整信息;如果多了,那麼說明接收的位元組數多了,取出合適的長度,並將剩餘的進行緩存;如果少了,說明接收的不夠,那麼將收到的進行一個緩存,等待下次請求,然後將兩條合並。

「[」「]」中括弧本身就不完整,此時讀不到length的值,因為中括弧里的內容被截斷了,那麼將讀到的數據進行緩存,等待讀取下次發送來的數據,然後將兩次合並之後再按上面的方式進行處理。

循環讀取所以信息可以這樣寫:


stringtemp="";
intbytesRead=clientStream.Read(buffer,0,MAX_LENGTH)
while(bytesRead>0)
{
temp+=Encoding.UTF8.GetString(buffer,0,bytesRead);
}

//temp到這里是客戶發送的全部信息。

當然你用非同步可以定義一個全局變數 temp來完成或設置足夠大的緩存。

當接收完成後。就要用上面所以的元數據來分解信息了(因為存在合並的信息)。

10. opc 非同步讀寫的是客戶端的緩存還是 plc

。我們通常購買或升級的內存條就是用作電腦的內存,內存條(SIMM)就是將RAM集成塊集中在一起的一小塊電路板,它插在計算機中的內存插槽上,以減少RAM集成塊佔用的空間。市場上常見的內存條有1G/條,2G/條,4G/條等。