starrydb的压力测试脚本是test.lua这段脚本得意义是创建2万个数据对象,
每个对象有个value值,之后为每个对象创建一个每秒触发的心跳。
在心跳中随机找到一个对象,如果对象可读就交换对象的value值。
这段脚本包含了5个阶段第一个阶段
创建对象local function creathob()o.doing的意识是在数据库的任意对象上执行一段脚本
这里第一个参数是“this“表示是在数据库根对象也就是node上执行这个脚本。
starry的设计原则就是object do something在同一时间同一个对象只能执行一段脚本,
反之一段脚本在同一时间,同一代码段内只能操作指定对象。
第二个参数是脚本代码的长度,
第三个参数是脚本代码。
可能有不熟悉lua的同学看到string.dump比较陌生。
string.dump的意识是把当前代码段的某个函数转为字符格式。
第四个参数的意识是当前执行代码的代号,
这参数会在执行代码时放入script.in.code让相同的代码段知道自己当前是在执行那个代号。
用于区分不同的返回值。
熟悉lua的同学会问为什么function前要加local因为starry设定lua环境全局变量不可写入。
creathob 函数创建了2万个对象,因为在我机器上超过2万个对象回导致cpu超过负荷,
而cpu超过负荷也不能搞垮starrydb,因为starrydb有很好的消息缓冲机制。
但cpu如果一直都满负荷运行消息缓冲就会越来越大最终导致内存消耗殆尽。
之后用随机整数初始化value值。
调用addtim添加心态在心跳脚本把当前对象的value值放入script.out内script.out是一个临时表,
在运行s.doing时会把临时表内的数据压缩传递给目标对象并施放在script.in内。
在dosomthing()时设置value值并返回value值给调用对象调用对象先判断是否成功。
这里说下lock变量的意义,当开始脚本时把lock变量设置为1,表示当前对象在执行一个操作拒绝为其他对象服务。
这是一种排斥锁,但这种锁不会阻塞操作。他是介于状态和锁的双重身份。
最主要的是不会对性能产生被动影响。请求对象在请求失败之后可以设置定时函数等形式重新尝试。
retdo函数判断返回是否成功如果成功就用返回的value值替换。
注意如果使用lock不当就会产生锁死,
此例子里21行如果lock不设置成0就会导致对象永远不可交换数据。
这里再说下lua 的 string.dump的一些特性
因为我们dump出来的函数是完全不同的环境下运行。
所以会有运行dump丢弃的函数和代码会找不到的问题。
例如一个代码片断
local function a() do end; local function b() do end; local s = string.dump(b);
如果代码里函数b调用了函数a
do s.set_double("a", 1); end local function b() do a() end local s = string.dump(b)
在其他环境运行上述s内的代码时
就会找不到函数a
就是说string.dump并不会检查函数b内的调用情况
那么为了让dump出来的脚本找到函数a
就要写成如下样式
local function b() do local function a()do end a() s.set_double("a", 1); end local s = string.dump(b)
这样看来string.dump也不会传递函数的参数
string.dump在文字化脚本的时候显然没有考虑也没有必要考虑
这段函数脚本需要什么样参数和返回值需要如何处理。
所以与其说是文字化函数不如说是只是文字化一段脚本。
那么嵌套样式的脚本调用也可以改为平行方式的脚本调用例如
a.lua
local function a() do s.set_double("a", 1); end
在脚本内使用dofile调用脚本a.lua
local function b() do dofile("a.lua") end local s = string.dump(b)
如果是本地的内存数据库这样方式看起来更加整洁。
如果是传递脚本到远程服务器执行需要服务器上已经存在或者
由用户提交到远程服务器上。