diff --git a/src/agent.lua b/src/agent.lua index f91a1a9..eeeec47 100644 --- a/src/agent.lua +++ b/src/agent.lua @@ -149,7 +149,7 @@ skynet.register_protocol { end, dispatch = function(session, address, cmd, data) skynet.ignoreret() - skynet.trace() --执行序的跟踪统计 + -- skynet.trace() --执行序的跟踪统计 cs(function() if cmd == actionCodes.Sys_heartBeat then agent_util:heart_beat(agentInfo) @@ -190,7 +190,7 @@ skynet.register_protocol { pack = skynet.pack, unpack = skynet.unpack, dispatch = function(session, address, submethod, ...) - skynet.trace() --执行序的跟踪统计 + -- skynet.trace() --执行序的跟踪统计 local result if not agentInfo.role then result = "__OFFLINE__" @@ -256,7 +256,7 @@ end skynet.start(function() skynet.dispatch("lua", function(session, source, command, ...) - skynet.trace() --执行序的跟踪统计 + -- skynet.trace() --执行序的跟踪统计 local f = CMD[command] if f then if command == "exit" then diff --git a/src/models/Daily.lua b/src/models/Daily.lua index fb8d8f2..874794b 100644 --- a/src/models/Daily.lua +++ b/src/models/Daily.lua @@ -7,14 +7,9 @@ function Daily:ctor(properties) end Daily.schema = { - key = {"string"}, -- redis key commentHero = {"string", ""}, --单日评论食灵记录 type=1 } -Daily.fields = { - commentHero = true, -} - function Daily:updateProperty(params) local type, default = table.unpack(self.schema[params.field]) diff --git a/src/models/Hero.lua b/src/models/Hero.lua index d8edd73..65ac74b 100644 --- a/src/models/Hero.lua +++ b/src/models/Hero.lua @@ -4,7 +4,6 @@ local HeroPlugin = import(".HeroPlugin") HeroPlugin.bind(Hero) Hero.schema = { - key = { "string" }, id = {"number"}, type = {"number", 0}, level = {"number", 1}, -- 等级 @@ -18,20 +17,6 @@ Hero.schema = { skin = {"number", 0}, --皮肤 0 、 1、 2、 3 } -Hero.fields = { - id = true, - type = true, - level = true, - breakL = true, - wakeL = true, - skillL = true, - talent = true, - battleV = true, - loveExp = true, - loveL = true, - skin = true, -} - function Hero:ctor( properties ) Hero.super.ctor(self, properties) end diff --git a/src/models/Role.lua b/src/models/Role.lua index 0301289..c7091d7 100644 --- a/src/models/Role.lua +++ b/src/models/Role.lua @@ -16,7 +16,6 @@ function Role:ctor( properties ) end Role.schema = { - key = {"string"}, id = {"number"}, uid = {"string", ""}, name = {"string", ""}, @@ -35,24 +34,10 @@ Role.schema = { reDiamond = {"number", 0}, items = {"string", ""}, loveStatus = {"string", ""}, --统计角色的最高 好感度等级 类型相关 -- type=loveL type=loveL -} -Role.fields = { - id = true, - uid = true, - sid = true, - device = true, - name = true, - banTime = true, - banType = true, - ltime = true, - ctime = true, - sversion = true, - level = true, - diamond = true, - reDiamond = true, - items = true, - loveStatus = true, + advPass = {"string", ""}, -- 冒险 通关记录 + advInfo = {"table", {}}, -- 冒险 相关信息 + } diff --git a/src/shared/ModelBase.lua b/src/shared/ModelBase.lua index 4ef9e3e..aaaeacc 100644 --- a/src/shared/ModelBase.lua +++ b/src/shared/ModelBase.lua @@ -1,9 +1,6 @@ local ModelBase = class("ModelBase") ModelBase.key = "key" -ModelBase.schema = { - key = {"string"} -} -ModelBase.fields = {} -- 数据库字段 field, update 是否立即更新 +ModelBase.schema = {} local string_format = string.format local table_insert = table.insert @@ -24,12 +21,61 @@ end function ModelBase:ctor(properties) self.isModelBase_ = true - -- self.dirtyFields = {} + self.cacheFields = {} --缓存字段 不更新数据库的字段 + + self[self.class.key .. "_"] = properties[self.class.key] --数据库key + properties[self.class.key] = nil + + if not self:isValidKey() then + print(string_format("%s [%s:key] should be give in new(ctor)", tostring(self), self.class.__cname)) + return + end if type(properties) ~= "table" then properties = {} end self:setProperties(properties, true) --缺少的域将设置默认值 end +-- startCache 和 endCache 在恰当的时候配对使用 +function ModelBase:startCache( ... ) + for _, field in ipairs({ ... }) do + if self.class.schema[field] then + self.cacheFields[field] = true + end + end +end + +function ModelBase:endCache( ... ) + args = { ... } + params = {} + + function doOneCache(field) + local propname = field .. "_" + table_insert(params, field) + if self.class.schema[fieldName][1] == "table" then + table_insert(params, MsgPack.pack(self[propname])) + else + table_insert(params, self[propname]) + end + end + + if not next(args) then + for field, _ in pairs(self.cacheFields) do + doOneCache(field) + end + self.cacheFields = {} + else + for _, field in ipairs(args) do + if self.cacheFields[field] then + self.cacheFields[field] = nil + doOneCache(field) + end + end + end + + if next(params) then + redisproxy:hmset(self:getKey(), table_unpack(params)) + end +end --[[-- 返回对象的 ID 值。 @@ -71,26 +117,24 @@ function ModelBase:create() return nil end - --将所有的域都置为dirty, 存储到redis - -- for fieldName, update in pairs(self.class.fields) do - -- self.dirtyFields[fieldName] = true - -- end self:save() self:onCreate() return self end - +-- save 忽略 缓存配置 function ModelBase:save() local redisProperties = self:getProperties() local params = {} for fieldName, value in pairs(redisProperties) do - -- if self.dirtyFields[fieldName] then - local propname = fieldName .. "_" - table_insert(params, fieldName) + local propname = fieldName .. "_" + table_insert(params, fieldName) + if self.class.schema[fieldName][1] == "table" then + table_insert(params, MsgPack.pack(self[propname])) + else table_insert(params, self[propname]) - -- end + end end if next(params) then redisproxy:hmset(self:getKey(), table_unpack(params)) @@ -127,6 +171,10 @@ function ModelBase:setProperties(properties, notWrite) local typ, def = table_unpack(schema) local propname = field .. "_" + if typ == "table" and type(properties[field]) == "string" then + properties[field] = MsgPack.unpack(properties[field]) + end + local val = properties[field] or def if val ~= nil then if typ == "number" then val = tonumber(val) end @@ -134,8 +182,13 @@ function ModelBase:setProperties(properties, notWrite) string_format("%s [%s:setProperties()] Type mismatch, %s expected %s, actual is %s", tostring(self), self.class.__cname, field, typ, type(val))) self[propname] = val - table_insert(params, field) - table_insert(params, val) + if not self.cacheFields[field] then + table_insert(params, field) + if typ == "table" then + val = MsgPack.pack(val) + end + table_insert(params, val) + end end end if not notWrite and next(params) then @@ -159,7 +212,7 @@ end ]] function ModelBase:getProperties(fields, filter) local schema = self.class.schema - if type(fields) ~= "table" then fields = table.keys(self.class.fields) end + if type(fields) ~= "table" then fields = table.keys(self.class.schema) end local properties = {} for i, field in ipairs(fields) do @@ -185,7 +238,7 @@ function ModelBase:getProperty(property) return self:getProperties({property})[property] end -function ModelBase:setProperty(property, value, update) +function ModelBase:setProperty(property, value) if not self.class.schema[property] then print(string_format("%s [%s:setProperty()] Invalid property : %s", tostring(self), self.class.__cname, property)) @@ -196,19 +249,24 @@ function ModelBase:setProperty(property, value, update) local propname = property .. "_" if typ == "number" then value = tonumber(value) end + if typ == "table" and not value then + value = self[propname] -- table 可以用自己的缓冲 + end assert(type(value) == typ, string_format("%s [%s:setProperties()] Type mismatch, %s expected %s, actual is %s", tostring(self), self.class.__cname, property, typ, type(value))) self[propname] = value - if self.class.fields[property] or update then + if not self.cacheFields[property] then + -- table 使用msgpack + if typ == "table" then + value = MsgPack.pack(value) + end redisproxy:hset(self:getKey(), property, value) - else - -- self.dirtyFields[property] = true -- record the fields been modified end end -function ModelBase:incrProperty(property, value, update) +function ModelBase:incrProperty(property, value) if not self.class.schema[property] then print(string_format("%s [%s:setProperty()] Invalid property : %s", tostring(self), self.class.__cname, property)) @@ -218,16 +276,16 @@ function ModelBase:incrProperty(property, value, update) local typ, def = table_unpack(self.class.schema[property]) local propname = property .. "_" + if typ == "table" then return end if typ == "number" then value = tonumber(value) end + assert(type(value) == typ, string_format("%s [%s:setProperties()] Type mismatch, %s expected %s, actual is %s", tostring(self), self.class.__cname, property, typ, type(value))) self[propname] = self[propname] + value - if self.class.fields[property] or update then + if not self.cacheFields[property] then return redisproxy:hincrby(self:getKey(), property, value) - else - -- self.dirtyFields[property] = true -- record the fields been modified end end -- libgit2 0.21.2