jit-uuid: 快速且无依赖的 LuaJIT UUID 库
安装
如果您尚未设置 RPM 仓库订阅,请 注册。然后您可以继续以下步骤。
CentOS/RHEL 7 或 Amazon Linux 2
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-jit-uuid
CentOS/RHEL 8+、Fedora Linux、Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-jit-uuid
要在 NGINX 中使用此 Lua 库,请确保已安装 nginx-module-lua。
本文档描述了 lua-resty-jit-uuid v0.0.7,于 2017 年 12 月 16 日发布。
[![Module Version][badge-version-image]][luarocks-resty-jit-uuid] [![Coverage Status][badge-coveralls-image]][badge-coveralls-url]
一个纯 LuaJIT(无依赖)UUID 库,经过性能优化。
动机
该模块旨在成为一个无依赖、高性能且完整的 LuaJIT 和 ngx_lua 的 UUID 库。
与 FFI 和 C 绑定不同,它不依赖于系统中可用的 libuuid。此外,它的性能 优于 大多数(所有?)与之进行基准测试的生成器,包括 FFI 绑定。
最后,它提供了额外的功能,如 UUID v3/v4/v5 生成和 UUID 验证。
请参阅 基准测试 部分,了解与其他 Lua/LuaJIT UUID 库的比较。
使用
LuaJIT:
local uuid = require 'resty.jit-uuid'
uuid.seed() ---> 使用 os.time()、LuaSocket 或 ngx.time() 自动播种
uuid() ---> v4 UUID(随机)
uuid.generate_v4() ---> v4 UUID
uuid.generate_v3() ---> v3 UUID(基于名称,使用 MD5)
uuid.generate_v5() ---> v5 UUID(基于名称,使用 SHA-1)
uuid.is_valid() ---> true/false(自动 JIT PCRE 或 Lua 模式)
OpenResty:
http {
init_worker_by_lua_block {
local uuid = require 'resty.jit-uuid'
uuid.seed() -- 非常重要!
}
server {
location / {
content_by_lua_block {
local uuid = require 'resty.jit-uuid'
ngx.say(uuid())
}
}
}
}
注意:在 ngx_lua 中生成 v4(随机)UUID 时,非常重要的是在 init_worker 阶段播种此模块。如果不这样做,您的工作进程将生成相同的 UUID 序列,这可能会导致您的应用程序出现严重问题。播种要求在 ngx_lua 之外的使用中也适用,尽管在这种情况下播种的要求不那么严格。此外,您应该注意使用 lua_code_cache 指令:如果禁用 Lua 代码缓存,后续请求中生成的所有 UUID 序列将是相同的,除非为每个请求播种此模块。就像禁用 Lua 代码缓存一样,这种行为将被视为 ngx_lua 反模式,您应该避免。
文档
文档可以在线访问 http://thibaultcha.github.io/lua-resty-jit-uuid/。
基准测试
该模块在每个实现步骤上进行了仔细的基准测试,以确保 OpenResty 和纯 LuaJIT 的最佳性能。例如,UUID 验证将在可能的情况下使用 JIT PCRE 而不是 Lua 模式。
bench.lua 文件提供了对多个流行 UUID 库的 UUID 生成基准测试。
运行 make bench 以执行它们:
LuaJIT 2.1.0-beta1 生成 1e+06 UUIDs
UUID v4(随机)生成
1. resty-jit-uuid 耗时: 0.064228s 0%
2. FFI 绑定 耗时: 0.093374s +45%
3. C 绑定 耗时: 0.220542s +243%
4. 纯 Lua 耗时: 2.051905s +3094%
UUID v3(基于名称和 MD5)生成(如果支持)
1. resty-jit-uuid 耗时: 1.306127s
UUID v5(基于名称和 SHA-1)生成(如果支持)
1. resty-jit-uuid 耗时: 4.834929s
UUID 验证(如果支持,70% 有效,30% 无效)
1. resty-jit-uuid (启用 JIT PCRE) 耗时: 0.223060s
2. FFI 绑定 耗时: 0.256580s
3. resty-jit-uuid (Lua 模式) 耗时: 0.444174s
- FFI 绑定: https://github.com/bungle/lua-resty-uuid
- C 绑定: https://github.com/Mashape/lua-uuid
- 纯 Lua: https://github.com/Tieske/uuid
- resty-jit-uuid: 本模块(生成 % 比较的基准参考)
注意:在 ngx_lua 中的 UUID 验证性能(JIT PCRE)可以通过启用 lua-resty-core 大大提高。
贡献
特别欢迎改善该模块或基准测试性能(任何被基准测试库)的建议。
GitHub
您可以在 nginx-module-jit-uuid 的 GitHub 仓库 中找到此模块的其他配置提示和文档。