平时在开发服务时,总需要要生成一些唯一id值,例如UUID,在OpenResty里面也一样,所幸的是,OpenResty里面提供一个针对性能调整的纯LuaJIT的UUID,那就是lua-resty-jit-uuid模块。
目前可以在GitHub上找到该库的信息,该模块创建就是为了成为LuaJIT和ngx_lua里面一个无依赖,高性能和完整的UUID库,它主要可以用来做uuid生成方法
官方代码如下:
local uuid = require 'resty.jit-uuid'
uuid.seed() ---> automatic seeding with os.time(), LuaSocket, or ngx.time()
uuid() ---> v4 UUID (random)
uuid.generate_v4() ---> v4 UUID
uuid.generate_v3() ---> v3 UUID (name-based with MD5)
uuid.generate_v5() ---> v5 UUID (name-based with SHA-1)
uuid.is_valid() ---> true/false (automatic JIT PCRE or Lua patterns)
代码如下:
http {
init_worker_by_lua_block {
local uuid = require 'resty.jit-uuid'
uuid.seed() -- very important!
}
server {
location / {
content_by_lua_block {
local uuid = require 'resty.jit-uuid'
ngx.say(uuid())
}
}
}
}
在ngx_lua中生成UUID时,需要在这个阶段为该模块设置种子init_worker。这一步非常重要,如果不这么做,可能会导致服务出现严重问题。同时这个地方也和lua_code_cache指令使用有关,如果Lua代码缓存被禁用,即
lua_code_cache off
时,每个ngx_lua处理的请求将运行在一个独立的Lua VM实例里面,后续请求期间生成的所以UUID序列将是相同的,除非每个请求都设置了该模块的种子。不推荐需要避免出现。
总的来说,在使用UUID库时,除了简单的必要配置生成外,建议在开发环境上关闭代码缓存,这样可以不用关闭Nginx,只需重载Nginx就可以更改openResty代码功能,但是在生产环境上则需要开启,因为缓存会影响OpenResty响应速度。