访问有授权验证的 Redis

对于有授权验证的 Redis,正确的认证方法,请参考下面例子:

  1. server {
  2. location /test {
  3. content_by_lua_block {
  4. local redis = require("resty.redis")
  5. local red = redis:new()
  6. red:set_timeout(1000) -- 1 sec
  7. local ok, err = red:connect("127.0.0.1", 6379)
  8. if not ok then
  9. ngx.say("failed to connect: ", err)
  10. return
  11. end
  12. -- 请注意这里 auth 的调用过程
  13. local count
  14. count, err = red:get_reused_times()
  15. if 0 == count then
  16. ok, err = red:auth("password")
  17. if not ok then
  18. ngx.say("failed to auth: ", err)
  19. return
  20. end
  21. elseif err then
  22. ngx.say("failed to get reused times: ", err)
  23. return
  24. end
  25. ok, err = red:set("dog", "an animal")
  26. if not ok then
  27. ngx.say("failed to set dog: ", err)
  28. return
  29. end
  30. ngx.say("set result: ", ok)
  31. -- 连接池大小是100个,并且设置最大的空闲时间是 10
  32. local ok, err = red:set_keepalive(10000, 100)
  33. if not ok then
  34. ngx.say("failed to set keepalive: ", err)
  35. return
  36. end
  37. }
  38. }
  39. }

这里解释一下 red:get_reused_times() 方法:

  • 如果当前连接不是从内建连接池中获取的,该方法总是返回 0 ,也就是说,该连接还没有被使用过。
  • 如果连接来自连接池,那么返回值永远都是非零。

所以这个方法可以用来确认当前连接是否来自池子。

对于 Redis 授权,实际上只需要建立连接后,首次认证一下,后面只需直接使用即可。换句话说,从连接池中获取的连接都是经过授权认证的,只有新创建的连接才需要进行授权认证。所以大家就看到了 count, err = red:get_reused_times() 这段代码,并有了下面 if 0 == count then 的判断逻辑。