redis manager

This commit is contained in:
云风
2012-08-15 15:25:54 +08:00
parent 82a523e27c
commit ab85ef535a
4 changed files with 46 additions and 33 deletions

View File

@@ -7,47 +7,32 @@ local redis = {}
local command = {} local command = {}
redis.cmd = command
local function assert_redis(result, err, ...)
assert(result, err)
return err, ...
end
setmetatable(command, { __index = function(t,k) setmetatable(command, { __index = function(t,k)
local f = function(...) local cmd = string.upper(k)
return assert_redis(skynet.call(".redis", skynet.unpack, skynet.pack(k, ...))) local f = function(self, ...)
local err, result = skynet.call( self.__handle, skynet.unpack, skynet.pack(cmd, ...))
assert(err, result)
return result
end end
t[k] = f t[k] = f
return f return f
end}) end})
function command.EXISTS(key) function command:exists(key)
local result , exists = skynet.call(".redis", skynet.unpack, skynet.pack("EXISTS", key)) local result , exists = skynet.call( self.__handle, skynet.unpack, skynet.pack("EXISTS", key))
assert(result, exists) assert(result, exists)
exists = exists ~= 0 exists = exists ~= 0
return exists return exists
end end
local function split(cmd) local meta = {
local cmds = {} __index = command
for v in string.gmatch(cmd,"[^ ]+") do }
table.insert(cmds,v)
end
return unpack(cmds)
end
local function send_command(cmd, ...) function redis.connect(dbname)
return command[cmd](...) local handle = skynet.call(".redis-manager",dbname)
end assert(handle ~= "")
return setmetatable({ __handle = handle } , meta)
function redis.send(cmd, more, ...)
if more == nil then
send_command(split(cmd))
else
send_command(cmd, more, ...)
end
end end
return redis return redis

View File

@@ -16,7 +16,7 @@ skynet.start(function()
print("simpledb",db) print("simpledb",db)
local connection = skynet.launch("connection","256") local connection = skynet.launch("connection","256")
print("connection",connection) 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) print("redis",redis)
skynet.exit() skynet.exit()
end) end)

27
service/redis-mgr.lua Normal file
View File

@@ -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"

View File

@@ -4,9 +4,10 @@ local redis = require "redis"
skynet.dispatch() skynet.dispatch()
skynet.start(function() skynet.start(function()
print(redis.cmd.EXISTS("A")) local db = redis.connect "main"
print(redis.cmd.GET("A")) print(db:exists "A")
print(redis.cmd.SET("A","hello world")) print(db:get "A")
print(db:set("A","hello world"))
skynet.exit() skynet.exit()
end) end)