2016-02-23 74 views
0

我是redis的新手,我認爲我有一個很好的redis用例。我試圖做的是緩存一個短時間的MP3文件。這些MP3的音量大於2M,但我也可能只會說5-10個時間段。它們上的TTL也相當短,分鐘而不是小時等。有沒有人在redis緩存中存儲過mp3?

(磁盤持久性不是選項)。

所以,我想知道的是,我需要得到花哨和Base64出來的MP3來存儲它嗎?或者我可以簡單地設置keyvalue = bytearray []?

這個redis命中將來自一個web服務,它反過來從磁盤命中的下游服務獲取數據。所以我想要做的就是在短時間內在中間件上緩存mp3文件,如果你願意的話。我不需要爲每個文件執行這個操作,只需要大於2M的文件就可以了,所以我不必繼續使用下游服務器並再次從磁盤請求文件。

謝謝!

尼克

回答

1

你當然可以保存它們,2MB什麼對Redis的存儲。

Redis是二進制安全的,您不需要base64數據,只需通過字節數組存儲在您最喜愛的客戶端。

我會考慮做的一件事(它可能不值得2Mb的數據,但如果我要存儲視頻文件的例子)是存儲該文件一個塊的序列,而不是一次加載所有的東西。如果您的應用一次不會在內存中保存多個文件,並且這些文件不是那麼大,則可能不值得。但是,如果您期待高併發性,請考慮這一點,因爲它可以節省應用程序內存,而不是redis內存。

您可以通過多種方式做到這一點:

  1. 您可以將每個塊存儲爲有序集合與序列號作爲得分的一個要素,並閱讀他們一個接一個,這樣你就贏了不必一次將所有內容加載到內存中。

  2. 您可以存儲該文件的完整字符串,但可以使用GETRANGE讀取塊。

例如,

GETRANGE myfile.mp3 0 10000 
GETRANGE myfile.mp3 100000 200000 
... #until you read nothing of course 
+0

我猜接下來的問題會是什麼方法?我使用stackexchange.redis,我能找到的最好的是StringSet(key,value)。 哦,存儲的總體量實際上會很小。這主要是因爲我只需要一次點擊磁盤,而不是每次都有部分內容請求進入。 –

+0

@NickJacobs我不知道具體的客戶端,但這是我使用的redis模式。 –

+0

我最終做的是這樣的: // var converted = Convert.ToBase64String(bytes); db.StringSet(「12412」,bytes,new TimeSpan(0,5,00)); –