diff --git a/main.lua b/main.lua index 43e790ce..b6fbe73d 100644 --- a/main.lua +++ b/main.lua @@ -1,16 +1,22 @@ local skynet = require "skynet" -print("Server start") -local launcher = skynet.launch("snlua","launcher.lua") -print("launcher", launcher) -local console = skynet.launch("snlua","console.lua") -print("console",console) -local watchdog = skynet.launch("snlua","watchdog.lua") -print("watchdog",watchdog) -local gate = skynet.launch("gate","8888 4 0") -print("gate",gate) -local db = skynet.launch("snlua","simpledb.lua") -print("simpledb",db) -local connection = skynet.launch("connection","256") -print(connection) -skynet.exit() +skynet.dispatch() + +skynet.start(function() + print("Server start") + local launcher = skynet.launch("snlua","launcher.lua") + print("launcher", launcher) + local console = skynet.launch("snlua","console.lua") + print("console",console) + local watchdog = skynet.launch("snlua","watchdog.lua") + print("watchdog",watchdog) + local gate = skynet.launch("gate","8888 4 0") + print("gate",gate) + local db = skynet.launch("snlua","simpledb.lua") + print("simpledb",db) + local connection = skynet.launch("connection","256") + print("connection",connection) + local redis = skynet.call(".launcher", "broker .redis snlua redis-cli.lua 127.0.0.1:6379") + print("redis",redis) + skynet.exit() +end) \ No newline at end of file diff --git a/redis-cli.lua b/redis-cli.lua index 1346e98d..38938b04 100644 --- a/redis-cli.lua +++ b/redis-cli.lua @@ -9,14 +9,27 @@ local fd local write_fd local readline_fd local read_fd +local close_fd local function init_fd(fdstr) fd = fdstr write_fd = "WRITE "..fd.." " readline_fd = "READLINE ".. fd .." \r\n" read_fd = "READ " .. fd .. " " + close_fd = "CLOSE "..fd end +local function init() + fd = skynet.call(".connection", "CONNECT " .. redis_server) + if fd == nil then + print("Connect to redis server error : ", redis_server) + skynet.exit() + return true + end + init_fd(fd) +end + + local function compose_message(msg) local lines = { "*" .. #msg } for _,v in ipairs(msg) do @@ -44,7 +57,7 @@ redcmd[42] = function(data) -- '*' local data = skynet.call(".connection", read_fd .. bytes) table.insert(result, string.sub(data,1,-3)) end - skynet.ret(skynet.pack(unpack(bulk))) + skynet.ret(skynet.pack(true,bulk)) end redcmd[36] = function(data) -- '$' @@ -54,7 +67,7 @@ redcmd[36] = function(data) -- '$' return end local firstline = skynet.call(".connection", read_fd .. (bytes + 2)) - skynet.ret(skynet.pack(string.sub(firstline,1,-3))) + skynet.ret(skynet.pack(true,string.sub(firstline,1,-3))) end redcmd[43] = function(data) -- '+' @@ -71,21 +84,30 @@ end skynet.dispatch(function(msg, sz, session, address) local message = { skynet.unpack(msg,sz) } - skynet.send(".connection", write_fd .. compose_message(message)) - local result = skynet.call(".connection", readline_fd) + local write_cmd = write_fd .. compose_message(message) + local result + while true do + skynet.send(".connection", write_cmd ) + result = skynet.call(".connection", readline_fd) + if result then + break + end + -- reconnect + if init() then + skynet.ret(skynet.pack(false , "Disconnected")) + return + end + end local firstchar = string.byte(result) local data = string.sub(result,2) local f = redcmd[firstchar] - assert(f) - f(data) + if f == nil then + skynet.ret(skynet.pack(false , "Invalid result")) + skynet.send(".connection", close_fd) + init() + else + f(data) + end end) -skynet.start(function() - fd = skynet.call(".connection", "CONNECT " .. redis_server) - if fd == nil then - print("Connect to redis server error : ", redis_server) - skynet.exit() - return - end - init_fd(fd) -end) +skynet.start(init) diff --git a/redis.lua b/redis.lua new file mode 100644 index 00000000..a367768a --- /dev/null +++ b/redis.lua @@ -0,0 +1,47 @@ +local skynet = require "skynet" +local string = string +local table = table +local unpack = unpack + +local redis = {} + +local command = {} + +redis.cmd = command + +setmetatable(command, { __index = function(t,k) + local f = function(...) + return skynet.call(".redis", skynet.unpack, skynet.pack(k, ...)) + end + t[k] = f + return f +end}) + +function command.EXISTS(key) + local result , exists = skynet.call(".redis", skynet.unpack, skynet.pack("EXISTS", key)) + exists = exists ~= 0 + return result, 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 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 +end + +return redis diff --git a/testredis.lua b/testredis.lua index e5f3da89..42abb909 100644 --- a/testredis.lua +++ b/testredis.lua @@ -1,14 +1,12 @@ local skynet = require "skynet" +local redis = require "redis" skynet.dispatch() -local command ="*2\r\n$3\r\nGET\r\n$1\r\nA\r\n" - skynet.start(function() - local cli = skynet.call(".launcher","broker redis snlua redis-cli.lua 127.0.0.1:7379") - print("redis-cli:", cli) - assert(cli) - print(skynet.call(cli, skynet.unpack, skynet.pack("GET","A"))) + print(redis.cmd.EXISTS("A")) + print(redis.cmd.GET("A")) + print(redis.cmd.SET("A","hello world")) skynet.exit() end)