2016-02-23 34 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)); –