redisdbpool.lua 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. local skynet = require "skynet"
  2. require "skynet.manager"
  3. local setting_template = require "settings"
  4. local skynet_node_name = ...
  5. local CMD = {}
  6. local pool = {}
  7. local next_id = 0
  8. local maxconn = 1
  9. local function next_conn()
  10. local id = next_id % maxconn + 1
  11. next_id = next_id + 1
  12. if id > maxconn then
  13. id = 1
  14. end
  15. return pool[id]
  16. end
  17. local function getconn(key)
  18. if key and (type(key) == "number" or tonumber(key)) then
  19. local id = math.floor((tonumber(key) - 1) % maxconn) + 1
  20. return pool[id]
  21. else
  22. return next_conn()
  23. end
  24. end
  25. local function call_redis_slave(addr, cmd, ...)
  26. return skynet.call(addr, "lua", cmd, ...)
  27. end
  28. local function send_redis_slave(addr, cmd, ...)
  29. skynet.send(addr, "lua", cmd, ...)
  30. end
  31. local function start()
  32. local settings = setting_template.db_cnf[skynet_node_name]
  33. INFO("redisdbpool 启动", skynet_node_name, inspect(settings))
  34. maxconn = tonumber(settings.redisdb_maxinst) or 1
  35. for i = 1, maxconn do
  36. local redis_slave = skynet.newservice("redisdb_slave")
  37. skynet.call(redis_slave, "lua", "start", settings.redisdb_cnf)
  38. table.insert(pool, redis_slave)
  39. end
  40. end
  41. function CMD.exec(cmd, uid, ...)
  42. local db = getconn(uid)
  43. return call_redis_slave(db, cmd, ...)
  44. end
  45. skynet.start(function()
  46. start()
  47. skynet.dispatch("lua", function(_, _, cmd, ...)
  48. local f = assert(CMD[cmd], cmd .. "not found")
  49. skynet.retpack(f(...))
  50. end)
  51. skynet.register("." .. SERVICE_NAME)
  52. end)