Hello!
2014-05-07 20:27 GMT-07:00 马思奇:
> 我想做个上传图片的功能,需要将图片传到redis中(其实是ssdb),key是文件自己的md5sum,看了下文档,发现lua-resty-upload接文件是每次读取一小块的,但是redis是一次把整个文件内容都写进去的,请问有什么办法可以让它追加写入?还是说这个场景不适用lua-resty-upload?
这个场景非常适合使用 lua-resty-upload. 这里有两种不同的实现策略可供选择:
1. 在 nginx 中全缓冲所有的上传文件数据,然后再一次性地写入 redis(比如使用 redis 的 set 命令)。此时,你可以为
lua-resty-upload
指定较大的块大小(毕竟块大小是你自己指定的),可以是你允许的最大的请求体的大小。当然,即使你指定较小的块,你也可以自己在 Lua
里把它们累积拼接成一个大 Lua 字符串(不过,不建议使用 .. 操作符进行字符串拼接,而应使用 table 追加元素,最后再一次性地通过
table.concat 拼接字符串)。这种做法的优点是较为简单,但在 Lua 空间里需要分配较多的内存,毕竟是全缓冲方式。
2. 使用严格的流式处理模式。在 ngx_lua 一侧一次读取一个数据块,然后立即写入 redis,并不在 Lua 空间里累积大量数据。其实
redis 协议也是支持数据追加的,见其标准的 append 命令:
http://redis.io/commands/APPEND
当然,我不确定你这里实际使用的 ssdb 后端是否支持 Redis 标准的 append 命令。
Regards,
-agentzh