为了缓解数据库压力,数据会缓存在lua table,满足频繁读写需求,再定时检查,发现数据变了则落地。
问题来了,lua table怎么检查数据变了?
table检查数据变了
答案很简单,使用 metatable,这里贴一个简单的例子。
-- db数据
db = {openid="openid_123", token="token_123"}
-- 缓存
cache = {}
setmetatable(cache, {
__index = function(t, k)
return db[k]
end,
__newindex = function(t, k, v)
if k ~= "__dirty" then
db.__dirty = true
end
db[k] = v
end,
__pairs = function(t, k)
return next, db, k
end,
})
for k, v in pairs(cache) do
print(k, v)
end
cache.__dirty = nil
print("cache.__dirty", cache.__dirty)
cache.token = "token_456"
print("cache.__dirty", cache.__dirty)
执行结果如下:
> dofile("test.lua")
token token_123
openid openid_123
cache.__dirty nil
cache.__dirty true
问题到这里就结束了。
接下来,我们再提出一个问题,lua table如何检查子项为table的数据变了?
继续阅读lua table怎么检查数据变了