6

我正在制作一个小型 sinatra 应用程序。它会进行几次 Redis 调用,返回数据,然后进行最后一次 Redis 调用以保存“统计信息”。

到目前为止,如果我想提前终止请求(基于输入),我发现我可以使用halt

# code code
halt send_blank if is_blocked? SETTINGS, host
# code code

最后,我想要这样的东西:

response.body = JSON.generate(outgoing)
# update user
STATISTICS.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s}))

是否可以发送响应然后执行 5~ ms redis write,这样客户端就不必等待了?无论我在哪里或如何放置最终统计 redis 调用,它都会将响应的发送延迟一些毫秒 - 不能欺骗 sinatra。

这可以在 Node 中轻松完成,但只需编写我想要完成的内容,它会在响应发送后触发;据我了解,这里的代码将在回击响应之前阻止执行大约 5 毫秒。

我试过使用 after .. do 过滤器,它们可以正常工作,除了你不能向它们传递 response.body 中的数据以外的任何东西——这意味着你不能向过滤器传递任何不会的东西输出!可以通过分配给 post("/") 范围之外的变量来避免这个问题,但是每秒有 100 多个请求,我希望你能看到如何通过各种“全局”交换数据会成为一个大问题。

这似乎很简单,但我找不到比 .. do filters 在文档中更好的东西了。

我可以创建一个线程或其他东西来使 redis.hset() 进程非阻塞,这行得通吗?似乎是硬核它。

谢谢!

4

1 回答 1

2

分叉 redis 写入应该可以工作。

像这样的东西:

response.body = JSON.generate(outgoing)
fork do
    # update user
    redis = Redis.new(:host => "your_host_name", :port => your_port_number)
    redis.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s}))
end
于 2012-09-08T12:27:45.343 回答