diff --git a/lualib/redis.lua b/lualib/redis.lua index 14ddec5b..96da61cc 100644 --- a/lualib/redis.lua +++ b/lualib/redis.lua @@ -7,47 +7,32 @@ local redis = {} local command = {} -redis.cmd = command - -local function assert_redis(result, err, ...) - assert(result, err) - return err, ... -end - setmetatable(command, { __index = function(t,k) - local f = function(...) - return assert_redis(skynet.call(".redis", skynet.unpack, skynet.pack(k, ...))) + local cmd = string.upper(k) + local f = function(self, ...) + local err, result = skynet.call( self.__handle, skynet.unpack, skynet.pack(cmd, ...)) + assert(err, result) + return result end t[k] = f return f end}) -function command.EXISTS(key) - local result , exists = skynet.call(".redis", skynet.unpack, skynet.pack("EXISTS", key)) +function command:exists(key) + local result , exists = skynet.call( self.__handle, skynet.unpack, skynet.pack("EXISTS", key)) assert(result, exists) exists = exists ~= 0 return exists end -local function split(cmd) - local cmds = {} - for v in string.gmatch(cmd,"[^ ]+") do - table.insert(cmds,v) - end - return unpack(cmds) -end +local meta = { + __index = command +} -local function send_command(cmd, ...) - return command[cmd](...) -end - - -function redis.send(cmd, more, ...) - if more == nil then - send_command(split(cmd)) - else - send_command(cmd, more, ...) - end +function redis.connect(dbname) + local handle = skynet.call(".redis-manager",dbname) + assert(handle ~= "") + return setmetatable({ __handle = handle } , meta) end return redis diff --git a/service/main.lua b/service/main.lua index e0193cd9..44f68460 100644 --- a/service/main.lua +++ b/service/main.lua @@ -16,7 +16,7 @@ skynet.start(function() print("simpledb",db) local connection = skynet.launch("connection","256") print("connection",connection) - local redis = skynet.call(".launcher", "broker .redis snlua redis-cli 127.0.0.1:6379 0") + local redis = skynet.launch("snlua","redis-mgr") print("redis",redis) skynet.exit() end) diff --git a/service/redis-mgr.lua b/service/redis-mgr.lua new file mode 100644 index 00000000..e27c653e --- /dev/null +++ b/service/redis-mgr.lua @@ -0,0 +1,27 @@ +local skynet = require "skynet" +local log = require "log" + +local name = { + main = "127.0.0.1:6379", +} + +local connection = {} + +skynet.dispatch(function(msg, sz , session, from) + local dbname = skynet.tostring(msg,sz) + if connection[dbname] then + skynet.ret(connection[dbname]) + return + end + if name[dbname] == nil then + log.Error("Invalid db name : "..dbname) + skynet.ret("") + return + end + + local redis_cli = skynet.launch("snlua", "redis-cli", name[dbname]) + connection[dbname] = redis_cli + skynet.ret(redis_cli) +end) + +skynet.register ".redis-manager" diff --git a/service/testredis.lua b/service/testredis.lua index 42abb909..264ee7e3 100644 --- a/service/testredis.lua +++ b/service/testredis.lua @@ -4,9 +4,10 @@ local redis = require "redis" skynet.dispatch() skynet.start(function() - print(redis.cmd.EXISTS("A")) - print(redis.cmd.GET("A")) - print(redis.cmd.SET("A","hello world")) + local db = redis.connect "main" + print(db:exists "A") + print(db:get "A") + print(db:set("A","hello world")) skynet.exit() end)