lua table怎么检查数据变了

为了缓解数据库压力,数据会缓存在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怎么检查数据变了

最近的一次面试经历

最近项目解散了,我离开了公司,出来找工作。在我更新简历后,有hr找到我面试,是我喜欢的公司,我欣然接受了。hr给我定了岗位,我觉得也可以。

本来我想等面几家公司后,有经验了再面这家公司,可就这么巧合。

一面

很快,hr帮我预约了一面,是视频面试。

等到快面试的时候,hr联系我改期,说是其中一位面试官临时有事。

我电脑关机,准备去吃饭。有人打电话给我,原来是另外一位面试官,问我没来面试的事,我跟他说hr改期了。他表示不好意思,他没有收到通知,误会了。我跟他说没事的。

第二天,hr帮我重新预约了一面。

面试真的要开始了,我提前5分钟进入视频会议室,看到已有一位面试官在里面。他看到我,主动跟我打招呼,跟我抱歉之前的事。

紧接着,他说,另外一个面试官应该是准点才来,让我稍等下。

我点点头,说,“没事的,我也是提前进来的”。

很快,另外一位面试官进来了。

我们互相问候一声后,我开始自我介绍:“我叫陈伟琪,我…”

突然,他打断了我,说:“跳过这个环节吧,我们提问题,你回答。我看过你简历,简历附带的博客我也看了,我就先问你了解的这些技术吧”。

我有点惊愕,但很快反应过来,说:“好的”。虽然我以前附带博客地址,但几乎很少有人注意到。
继续阅读最近的一次面试经历

Google Protobuf协议分析

protobuf 是google开源的一个序列化框架,类似xml,json,最大的特点是基于二进制,比传统的XML表示同样一段内容要短小得多。还可以定义一些可选字段,用于服务端与客户端通信。前面几篇文章说了protobuf的用法,看到网上也没有分析protobuf协议的文章,就利用一些时间写了 protobuf 的协议分析。

protobuf协议核心思想
基于128bits的数值存储方式(Base 128 Varints)
数据表示方式:每块数据由接连的若干个字节表示(小的数据用1个字节就可以表示),每个字节最高位标识本块数据是否结束(1:未结束,0:结束),低7位表示数据内容。(可以看出数据封包后体积至少增大14.2%)

数字1的表示方法为:0000 0001,这个容易理解
数字300的表示方法为:1010 1100 0000 0010
继续阅读Google Protobuf协议分析

Erlang集群IP及端口管理

erlang集群是依靠epmd维护的,epmd是erlang集群节点间端口映射的守护进程,负责维护集群内的节点连接,提供节点名称到IP地址及端口的解析服务。

epmd 自定义端口号

epmd端口配置
默认情况下,epmd绑定在4369端口。但是,端口固定的话,容易遭受攻击,可能导致新节点的认证失败而无法启动,或无法加入集群。或者要在一台机器上部署不同的erlang集群,希望不会互相干扰。
epmd -daemon -port 5000
如果想用调试模式启动 epmd,使用 epmd -d -port 5000

另外,epmd通常伴随着erlang节点启动时自动启动,无须手动处理,所以,这里也可以通过修改erl启动参数以达到自动调整epmd端口。
erl -name hello@127.0.0.1 -epmd “epmd -port 5000 -daemon” 
继续阅读Erlang集群IP及端口管理

在erlang项目使用protobuf

protobuf是google的一个序列化框架,类似XML,JSON,其特点是基于二进制,比XML、JSON表示同样一段内容要短小得多,还可以定义一些可选字段,广泛用于服务端与客户端通信。文章将着重介绍在erlang中如何使用protobuf。

首先google没有提供对erlang语言的直接支持,所以这里使用到的第三方的protobuf库(erlang_protobuffs
继续阅读在erlang项目使用protobuf