Hello!
2014-07-28 10:41 GMT-07:00 Hammerdin He:
> 我需要实现的是一个数据查询系统,设想的方案是由用户的浏览器发起查询请求到nginx,然后首先在Redis内查询,若查询到数据,则返回用户,若在Redis内查询不到则去HBase内查询,若查询到,则返回给用户,并将查询到的数据写入Redis,若HBase内仍没有所需数据,则告知用户没有所需数据。为此我打算采用ngx_srcache和ngx_lua来实现这种请求的逻辑,我的nginx.conf的相关代码大体如下,大部分直接复制于nginx的wiki,自己添加了一点,但是我觉得自己写的并不正确,特别是我非常不清楚当数据在HBase内被查询到时,这数据是怎样被nginx写入Redis内的,请您告诉我这段代码需要怎样修改才能满足我的设想,非常感谢!
>
如果我对你这里的逻辑没有理解错的话,你应当直接用访问 hbase http 服务的 proxy_pass 指令在 location /api
里面替换掉 content_by_lua. 我不明白你出于什么考虑要在这里使用 content_by_lua 以及
ngx.location.capture. 不过你要小心转发给 hbase 的实际的 URI,如果不是你期望的,你需要自己通过
rewrite 这样的配置指令进行调整。
ngx_srcache 被设计成一个透明的缓存层,所以你不用考虑响应在 cache miss 时如何写到缓存后端中去,而只需要正确配置
srcache_store 指令就可以了。
在实现上,srcache_store
会注册一个输出过滤器,在主请求输出响应时拦截并复制所有的响应数据,并缓冲在内存中,直到它看到主请求响应体的末尾时,就发起你在
srcache_store 中指定的子请求,完成主请求响应向缓存的写入操作。
>
> 最后,对于上面 location /api 内的代码,假设一种场景是在Redis内未查到,接着去HBase查询,那么请问代码的执行顺序是
> 先执行srcache_fetch GET,再执行content_by_lua内的语句进行判断,再执行srcache_store PUT
基本上是这样的顺序,不过 srcache_store 和你的 content handler(比如 proxy_pass 和
content_by_lua)的执行有重叠,上面已经提到了。
Regards,
-agentzh