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 = {}
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

View File

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

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.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)