我正在制作一个小型的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写入,以便客户端不必等待?无论我在何处或如何进行最终统计redis调用,它都会将响应的发送延迟几毫秒 - 不能欺骗sinatra。
这可以很容易地在Node中完成,但只是写下我想做的事情,它会在响应发送后触发;据我所知,这里的代码会在拍摄回复之前阻止执行大约5ms。
我尝试使用after ... do过滤器,它们会正常工作,除了你不能传递除response.body中的数据以外的任何东西 - 意味着你不能传递给过滤器任何不是要输出! 通过分配在帖子范围之外的变量(“/”)可以避免这个问题,但是每秒有100多个请求,我希望你能看到如何通过“全局”类型交换数据会成为一个巨大的问题。
看起来真的很简单,但我找不到比...更好的东西..在文档中做过滤器。
我可以创建一个线程或其他东西来使redis.hset()进程无阻塞吗?看起来像是黑客攻击它。
谢谢!
答案 0 :(得分: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