if syn_cmd == ORM_SYN_CMD.ADD then add_map_value(main_map, data, keylen, data_map, main_key, keylist, add_cb) end
根据keylen插入到正确的嵌套层级。
CHANGE —— 修改数据
1 2 3
if syn_cmd == ORM_SYN_CMD.CHANGE then change_ma_value(main_map, data, keylen, keylist, change_cb) end
找到对应记录后,使用table_util.merge将变更字段合并进去(只传递变更字段,非全量)。
DEL —— 删除数据
1 2 3
if syn_cmd == ORM_SYN_CMD.DEL then del_map_value(main_map, data, data_map, main_key, del_cb) end
删除记录后,从下往上回溯清理空的父级table,避免内存泄漏:
1 2 3 4 5 6 7 8 9 10
-- 从下往上检查并清理空的父级table for i = #path, 1, -1do local parent_map = path[i].map local parent_key = path[i].key ifnotnext(parent_map[parent_key]) then parent_map[parent_key] = nil else break end end
localfunctioncluster_up(svr_name, svr_id) -- 遍历所有该节点相关的orm_frpc_client实例 for i = 1, #weak_list do local t = weak_list[i] -- 对每个已watch的main_key重新全量同步 for main_key inpairs(watched) do local ret = t._cli:call_by_alias("watch_first_syn", main_key) -- 重建本地镜像 init_main_data(keylist, data_map, data, main_key) end end end
重连后不会重复触发add_cb,仅静默替换本地镜像数据。
GC安全
使用__gc元方法,确保对象被回收时自动取消所有watch订阅:
1 2 3 4 5 6 7
__gc = function(self) ifnotself._watched thenreturnend for main_key inpairs(self._watched) do local push_key = "_orm_" .. self._orm_entity_instance_name .. "_" .. main_key watch_client.unwatch_byid(self._svr_name, self._svr_id, push_key, "orm_frpc_client") end end