簡體   English   中英

Redis 在nodejs中緩存

[英]Redis caching in nodejs

所以我在看這個模塊,我不明白為什么它使用回調。

我認為 memory 緩存應該很快,這也是有人使用緩存的目的,因為它很快......就像即時一樣。

添加回調意味着您需要等待某些東西。 但實際上你需要等待多少? 如果結果很快就返回給您,您是不是通過將所有內容都包裝在回調+承諾中來減慢速度(因為作為該模塊的用戶,您被迫承諾這些回調)?

按照設計,javascript 對於大多數外部調用(http、第三方庫……)都是異步的。

正如這里提到的

Javascript 是一種單線程語言。 這意味着它有一個調用堆棧和一個 memory 堆。 正如預期的那樣,它按順序執行代碼,並且必須在執行下一段代碼之前完成一段代碼。 它是同步的,但有時可能是有害的。 例如,如果 function 需要一段時間才能執行或必須等待某事,它會同時凍結所有內容。

具有同步 function 將阻塞線程和腳本的執行。 為避免任何阻塞(由於網絡、文件訪問等),建議異步獲取這些信息。

大多數時候,redis 緩存需要幾毫秒。 但是,這可以防止可能的網絡延遲,並使您的應用程序保持正常運行,並為您的客戶提供少量連接錯誤。

TLDR:從 memory 讀取速度很快,從網絡讀取速度較慢,不應阻塞進程

你是對的。 從 memory 緩存讀取非常快。 它與訪問任何變量(微秒或納秒)一樣快,因此沒有充分的理由將其實現為回調/承諾,因為它會明顯變慢。 但這僅在您從 nodejs 進程 memory 讀取時才成立。

從節點使用 redis 的問題在於 memory 緩存存儲在另一台機器(redis 服務器)或至少另一個進程上。 所以即使 redis 讀取數據非常快,它仍然必須通過網絡 go 才能返回到您的節點服務器,這並不總是保證很快(通常至少幾毫秒)。 例如,如果您使用的 redis 服務器在物理上並不靠近您的 nodejs 服務器,或者您有太多網絡請求,......請求可能需要更長的時間才能到達 redis 並返回到您的服務器。 現在想象一下,如果默認情況下這是阻塞的,它將阻止您的服務器執行任何其他操作,直到請求完成。 這將導致性能非常差,因為您的服務器處於空閑狀態等待網絡旅行。 這就是為什么 nodejs 中的任何 I/O(磁盤、網絡、..)操作在默認情況下都應該是異步的。

亞歷克斯,您評論說“我認為 memory 緩存應該很快,這也是有人使用緩存的目的,因為它很快......就像即時一樣。” 你幾乎是完全正確的。

現在, Redis 實際上是什么意思?

這意味着遠程字典服務器。

~常見問題 - Redis

是的,字典通常在O(1)時間內執行。 但是,請注意,從在持有字典的進程內部運行的程序的外觀來看,對上述性能的感知是有效的。 因此,從另一個進程訪問 Redis 進程擁有的Redis是一個不是O(1)的操作通道。

因此,因為 Redis 是一個遠程字典服務器,所以需要異步 API 才能訪問其服務。

正如這里已經回答的那樣,您的 redis 實例可能在您的機器上(並且訪問 redis RAM 存儲幾乎與訪問常規 javascript 變量一樣快)但它也可以是另一台機器//雲。 在這種情況下,網絡延遲可能會出現問題,這就是 promises/callbacks 語法的原因。

如果您 100% 確信您的 Redis 實例將始終位於您的代碼所在的同一台機器上,那么對它進行一些阻塞異步調用就可以了,您可以使用 ES6 await語法將其編寫為阻塞同步事件並避免回調或承諾:)

但就編碼習慣和可擴展性而言,我不確定這是否值得。 但是每個項目都是不同的,這可能適合你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM