簡體   English   中英

如果我在Flask應用程序中使用SimpleCache會出現什么問題

[英]What can go wrong if I use SimpleCache in my Flask app

我們使用以下設置:NGINX + Gunicorn + Flask。 我們需要添加一點緩存,每個Flask工作者不超過5Mb。 SimpleCache似乎是最簡單的解決方案 - 它在Python進程本身內部使用內存。

不幸的是,文檔說明了以下內容:

“用於單個進程環境的簡單內存緩存。此類主要用於開發服務器,並且不是100%線程安全的。”

但是,在我們的設置中,我沒有看到線程安全在哪里都很重要。 我認為Gunicorn讓幾個Flask工作者在運行,每個工人都有自己的小緩存。 什么可能出錯?

我目前正在處理一個場景,在用戶登錄應用程序后,我想將他的IP,用戶名插入數據庫。

現在,我只能做一次的方法是使用Cache將用戶的ip和用戶名存儲在緩存中。

現在,每個gunicorn進程初始化自己的緩存時都會出現問題。 如果為proc1的緩存添加用戶名+ ip組合,如果proc2接收到同一用戶的下一個請求,它將無法在其緩存中找到它,因此將其再次添加到其緩存和數據庫中,這是不合適的。 因此,在這種情況下,線程安全(進程安全)緩存很重要。

示例日志:

2015-07-07 22:42:31 - myapp.views:29 - DEBUG - not from cache user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:31 - myapp.views:30 - DEBUG - from cache : user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:40 - myapp.views:29 - DEBUG - not from cache user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:40 - myapp.views:30 - DEBUG - from cache : user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:41 - myapp.views:29 - DEBUG - not from cache user1100.100.100.100, <type 'unicode'> [14779]
2015-07-07 22:42:41 - myapp.views:30 - DEBUG - from cache : None, <type 'NoneType'> [14779]
2015-07-07 22:42:41 - myapp.views:32 - DEBUG - new username ip [14779]
2015-07-07 22:42:41 - myapp.views:38 - DEBUG - User : user1, ip : 100.100.100.100, noted at time : Tue Jul  7 22:42:41 2015, login_count : None [14779]

您可以看到gunicorn進程14776首先將其添加到其緩存中,並且下一個請求被14776選中,因此數據庫條目僅發生一次,但之后,下一個請求被14779拾取,將其添加到其緩存中,因此db 。

cache = SimpleCache(threshold=1000, default_timeout=3600)

使用基於memcache或redis的緩存可以解決它。 我自己在嘗試。

對於使用gunicorn的用例,沒有多線程問題,因為每個服務在其自己的進程中單線程運行。 但潛在的問題是“臟”讀取數據。

考慮以下情況:

  1. process1從db讀取並填充自己的緩存cache1
  2. process2使用相同的查詢從同一個表中讀取並填充其自己的緩存cache2
  3. process2使用新數據更新表並使舊cache2無效
  4. process1再次執行相同的查詢,使用過時的數據從cache1讀取! 這是出現問題的原因,因為process1 / cache1不知道數據庫更新

暫無
暫無

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

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