① Elasticsearch的緩存機制簡介
根據名稱其實就能理解,這是屬於Node級別的緩存。主要用於緩存Filter中的Query結果,基於LRU策略,當緩存滿了的情況下,會自動去除一個最近最少被使用的Query Cache。
緩存分為兩個級別,第一級是 Query ,第二級是 Segmemt ,就像是 Map<Query, Map<Segment, DocIdSet>> 這種結構一樣。 DocIdSet 使用的數據結構是 Bitset 。
indices.queries.cache.size 集群中的每個節點都必須有的靜態配置,用來控制用來緩存的內存大小,默認是10%,支持兩種格式一種是百分數,代表占節點heap的百分比,另一種則是精確的值,比如512mb。
indices.queries.cache.count 在官方文檔並沒有寫,這是一個節點級別的配置,可以在elasticsearch.yml中配置,控制緩存的總數量。
indices.queries.cache.all_segments 用於是否在所有 Segment 上啟用緩存,默認是false,不會對文檔數小於100000或者小於整個索引大小的3%的 Segment 進行緩存。
index.queries.cache.enabled 是屬於index級別的配置,用來控制是否啟用緩存,默認是開啟的。
Segment 中文檔數大於100000或者大於整個所以大小的3%。
請注意如果想要索引所有段,請設置indices.queries.cache.all_segments
緩存不會失效,而是通過判斷文檔是否符合 Query 的條件,如果符合條件的話則會將文檔加入到 Bitset 中。
主要用於 sort 以及 aggs 的欄位。這會把欄位的值載入到內存中,以便於快速訪問。 field data cache 的構建非常昂貴,因此最好能分配足夠的內存以保障它能長時間處於被載入的狀態。
indices.fielddata.cache.size 用來控制緩存的大小,支持兩種格式,一種是百分數,代表占節點heap的百分比,另一種是精確值,如10gb,默認是無限。
顧名思義,Shard級別的緩存。默認的主要用於緩存size=0的請求, aggs 和 suggestions ,還有就是 hits.total 。
需要注意,每當分片索引refresh的時候,如果數據發生了實際變化,那麼緩存就會自動失效。所以呢,refresh時間越長,那麼緩存的時間也就越長。緩存採用的也是LRU策略。
index.requests.cache.enable 這個參數用來控制是否啟用分片級別的緩存,默認是false
通過url傳參方式request_cache=true
indices.requests.cache.size 用來控制緩存在 heap 中的大小,默認是1%。
用於緩存新索引的數據,用於緩存新索引的數據,當空間填滿之後,會將數據寫到磁碟上成為一個新的段。
② 初入nodejs,被一個題困惑了,求解答
對於每一次的http請求都創建了一個through對象.這也許是造成錯誤的原因.
我猜測原因是這樣的 : 題目中提到了This is great because our server can response immediately without buffering everything in memory first. 這句話說明 through是沒有緩存機制的(沒有存入內存),如果多個http並發請求共有一個through對象來處理,可能會發生有內容丟失.
③ nest.js 緩存 定時更新
在開發調試web的時候,經常會碰到因瀏覽器緩存(cache)而經常要去清空緩存或者強制刷新來測試的煩惱,提供下apache不緩存配置和nginx不緩存配置的設置。 apache: 首先確定配置文件httpd.conf中確已經載入mod_headers模塊。
Node.js起源於2009年3月。最初Ryan Dahl是為了構建一個高性能的文本伺服器,而node.js是他在尋找一種更高提升web伺服器性能發現的,事件驅動、非阻塞I/O這種方式能更好的提高性能。隨著Nodejs的不斷發展,Nodejs漸漸演變成一種構建網路應用的基礎框架,並發展為一個不共享任何資源的單線程、單進程系統,但包含了很適合網路的庫,這樣Nodejs就為構建大型分布式應用提供了基礎設施。他們的目標都是為了構建快速、可伸縮的網路應用平台。它自身非常簡單、採用通信協議來組織許多的Node,非常容易通過拓展來達成構建大型網路應用的目的。
④ 有沒有辦法取消 node.js 對 require 模塊的緩存
require是nodejs根據commonjs的模塊規則所產生的,
而nodejs之所以能成為服務端語言的重要原因就是克服了js原有的模塊機制缺失,
所以require是必需的。那如何清除緩存呢?
delete require.cache[require.resolve('你require的那個')];
即可
⑤ NodeJS中的模塊是單例的嗎
NodeJS的模塊默認情況下是單例性質的,不過其並不能保證如我們編程時設想的那樣一定是單例,根據NodeJS的官方文檔中描述,某個模塊導入是否為單例受以下兩個因素的影響:
Node 模塊的緩存機制是大小寫敏感的,譬如如果你 require('/foo') 與 require('/FOO')會返回兩個不同的對象,盡管你的foo與FOO是完全相同的文件。
模塊是基於其被解析得到的文件名進行緩存的,鑒於不同的模塊會依賴於其被調用的路徑進行緩存鑒別,因此並不能保證你使用 require('foo') 會永遠返回相同的對象,可能會根據不同的文件路徑得到不同的對象。
⑥ nodejs清理谷歌瀏覽器緩存
nodejs清理谷歌瀏覽器緩存方法如下。
1、打開需清緩存的頁面,再按F12調出開發模式框。
2、勾選Network標簽下Disablecache選項。
3、按F5或右鍵重新載入刷新頁面內容。
4、頁面重新載入完成再按F12隱藏開發模式框即可清理谷歌瀏覽器緩存。
⑦ nodejs socket怎麼主動刷新緩存區數據
清空socket緩存區的數據的方法
由於socket是以數據流的形式發送數據,接收方不知道對方一次性發送了多少數據,也能保證對方一次性發送的數據能在同一刻接收到,所以Receive方法是這么工作的:
接受一個byye[]類型的參數作為緩沖區,在經過一定的時間後把接收到的數據填充到這個緩沖區裡面,並且返回實際接收到數據的長度,這個實際接收到的數據長度有可能為0(沒有接收到數據)、大於0小於緩沖區的長度(接收到數據,但是沒有我們預期的多)、等於緩沖區的長度(說明接收到的數據大於等於我們預期的長度)。
每次接收緩沖區都用同一個byte[] byteMessage,並且你沒有檢查接收到的數據長度,所以第一次你接收到的數據是123456,第二次你只接收到了8,但是緩沖區裡面還有23456,所以加起來就是823456了。
socket接收緩沖區的大小有講究,設置大了接收起來慢,因為它要等盡可能多的數據接收到了再返回;設置小了需要重復多次調用接收方法才能把數據接收完,socket有個屬性,標識了系統默認的接收緩沖區大小,可以參考這個!
還有就是用recv讀取,但是由於不知道緩存里有多少數據,如果是阻塞模式,到最後必然等到超時才知道數據已經讀取完畢,這是個問題。
另一個是用fgetc,通過返回判斷是否是feof:
whlie (1) { a=fgetc(f);if (feof(f)) break;//…
b=fgetc(f);if (feof(f)) break;//…}當然,我不知道讀取完畢後最後一次調用fgetc會不會堵塞,需要測試。
在非阻塞模式下,我們用recv就可以輕松搞定了,但是阻塞模式下,由於我們不知道緩沖區有多少數據,不能直接調用recv嘗試清除。
使用一個小小的技巧,利用select函數,我們可以輕松搞定這個問題:
select函數用於監視一個文件描述符集合,如果集合中的描述符沒有變化,則一直阻塞在這里,直到超時時間到達;在超時時間內,一旦某個描述符觸發了你所關心的事件,select立即返回,通過檢索文件描述符集合處理相應事件;select函數出錯則返回小於零的值,如果有事件觸發,則返回觸發事件的描述符個數;如果超時,返回0,即沒有數據可讀。
重點在於:我們可以用select的超時特性,將超時時間設置為0,通過檢測select的返回值,就可以判斷緩沖是否被清空。通過這個技巧,使一個阻塞的socket成了『非阻塞』socket.
現在就可以得出解決方案了:使用select函數來監視要清空的socket描述符,並把超時時間設置為0,每次讀取一個位元組然後丟棄(或者按照業務需要進行處理,隨你便了),一旦select返回0,說明緩沖區沒數據了(「超時」了)。
⑧ 有沒有辦法取消 node.js 對 require 模塊的緩存
可以嘗試用javascript的delete語言特性試試,一般來說不需要釋放對require模塊的緩存,你的要求比較特別。
⑨ nodejs的優勢
NodeJs的優勢:
現在的很多的伺服器端的語言(PHP,JAVA,ASP.net),有什麼問題呢,現在的伺服器端的語言在用戶訪問伺服器時,為每個用戶鏈接創建了一個線程,但每個線程大約要耗費2M的內存,如果一個8G內存的伺服器,也就能鏈接4000個左右的用戶,如果用戶的鏈接數較大,就必須增加伺服器的數量,而且現在用戶的鏈接方式有很多(如app,網頁同時訪問),這就又涉及到伺服器共享的問題,所以伺服器怎麼支持最大的同時鏈接用戶量就成了一個問題;
NodeJS修改了客戶端到伺服器端的鏈接方法,解決了這個問題,他不在為每個客戶端創建一個新的線程,而是為每個客戶端鏈接出發一個NodeJs內部進行處理的事件,所以NodeJS具備同時處理多達幾萬個用戶的客戶端鏈接的能力;
NodeJS適合開發的應用程序:
當應用程序需要處理大量並發的輸入/輸出,而在向客戶端發出響應之前,應用程序內部並不需要進行非常復雜的處理的時候,我們應該考慮使用NodeJs來進行應用程序的開發,例如:
1、聊天伺服器:如果聊天的人很多,用戶的與伺服器之間的並發鏈接量很大,但是伺服器端的數據處理並不復雜;
2、綜合類服務網站和電子商務網站的伺服器:在這類網站中的伺服器端,往往可能每秒存內可以接受多達上千條的數據並且需要將這些數據寫入資料庫中,NodeJs可以通過其隊列機制將這些數據迅速寫入緩存區中,然後再通過每一個單獨的處理從緩存區中取出這些數據並將其寫入資料庫中,如果是其他的伺服器(如Apache伺服器或Tomcat伺服器)的話,由於這些伺服器採用的是阻塞型I/O機制,因此每條數據寫入到資料庫中都要等待一段時間(等上一條寫完,才能寫下一條),但是NodeJs使用的是非阻塞的I/O機制,因此可以實現這些數據到資料庫中的寫入,而不必再為每條數據的寫入而等待一段時間;
總結:
一個規模稍微大點的系統都不是一種開發語言可以搞定的,往往是幾種混雜一起,比如c、c++做伺服器端開發,java做業務邏輯,php等做前端展示,此外還需要消息中間件等等。
nodejs可以很快地在伺服器端做原型(原來只有c系和java等能做的事情,性能還很高),而且代碼量相對會少很多;另一點是它的語法優勢,js閉包等。但它不太適合做cpu密集型處理的工作,只能繞著彎去解決,據說這次QCon會有人分享這方面的研究成果,可以關注下。
每種語言都有它適合的領域,沒必要強求一門語言可以解決所有事情,擁有其它語言的特性,只有不斷的tradeoff把系統做出來才是目標。這些都是叢書上看到總結的,還望指正