{"id":16367166,"url":"https://github.com/snower/slock-lua-nginx","last_synced_at":"2026-02-21T15:30:15.896Z","repository":{"id":149340017,"uuid":"269044424","full_name":"snower/slock-lua-nginx","owner":"snower","description":"slock nginx lua ext","archived":false,"fork":false,"pushed_at":"2024-05-10T06:46:46.000Z","size":28,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-12-24T22:33:18.016Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Lua","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/snower.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-03T09:22:34.000Z","updated_at":"2024-06-18T05:53:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"ef08ba0e-cc95-4a3a-ac3b-b568b1f7f8c1","html_url":"https://github.com/snower/slock-lua-nginx","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snower%2Fslock-lua-nginx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snower%2Fslock-lua-nginx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snower%2Fslock-lua-nginx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snower%2Fslock-lua-nginx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/snower","download_url":"https://codeload.github.com/snower/slock-lua-nginx/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239850437,"owners_count":19707350,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-11T02:48:47.158Z","updated_at":"2026-02-21T15:30:15.836Z","avatar_url":"https://github.com/snower.png","language":"Lua","funding_links":[],"categories":[],"sub_categories":[],"readme":"# slock-lua-nginx\n\nHigh-performance distributed sync service and atomic DB. Provides good multi-core support through lock queues, high-performance asynchronous binary network protocols. Can be used for spikes, synchronization, event notification, concurrency control. https://github.com/snower/slock\n\n# Conf Example\n\n```conf\nlua_package_path \"lib/resty/?.lua;\";\n\ninit_worker_by_lua_block {\n        local slock = require(\"slock\")\n        slock:connect(\"lock1\", \"127.0.0.1\", 5658)\n}\n\nserver {\n        listen 8080;\n        default_type text/html;\n\n        location /echo {\n                echo \"hello world\";\n        }\n\n        location /lock {\n                content_by_lua_block {\n                        local slock = require(\"slock\")\n                        local client = slock:get(\"lock1\")\n                        local lock_key = \"test\"\n                        local args = ngx.req.get_uri_args()\n                        for key, val in pairs(args) do\n                                if key == \"lock_key\" then\n                                        lock_key = val\n                                end\n                        end\n                        local lock = client:newLock(lock_key, 5, 3)\n                        local ok, err = lock:acquire()\n                        if not ok then\n                                ngx.say(\"acquire error:\" .. err)\n                        else\n                                ngx.ctx.lock1 = lock\n                                ngx.say(\"\u003cp\u003ehello, world\u003c/p\u003e\")\n                        end\n                }\n\n                log_by_lua_block {\n                        local lock = ngx.ctx.lock1\n                        if lock ~= nil then\n                                local ok, err = lock:releasetry()\n                                if not ok then\n                                        ngx.log(ngx.ERR, \"slock release error:\" .. err)\n                                end\n                        end\n                }\n        }\n\n        location /event {\n                content_by_lua_block {\n                        local slock = require(\"slock\")\n                        local client = slock:get(\"lock1\")\n                        local event_type = \"clear\"\n                        local wait_type = \"\"\n                        local event_key = \"event\"\n                        local args = ngx.req.get_uri_args()\n                        for key, val in pairs(args) do\n                                if key == \"event_type\" then\n                                        event_type = val;\n                                end\n                                if key == \"wait_type\" then\n                                        wait_type = val;\n                                end\n                                if key == \"event_key\" then\n                                        event_key = val;\n                                end\n                        end\n\n                        local event = nil;\n                        if event_type == \"clear\" then\n                                event = client:newDefaultClearEvent(event_key, 60, 60)\n                        else\n                                event = client:newDefaultSetEvent(event_key, 60, 60)\n                        end\n\n                        if wait_type == \"cycle\" then\n                                local ok, err = event:waitAndTimeoutRetryClear(60)\n                                if not ok then\n                                        ngx.say(\"cycle wait fail \" .. err)\n                                else\n                                        ngx.say(\"cycle wait succed\")\n                                end\n                        else\n                                local ok, err = event:wait(60)\n                                if not ok then\n                                        ngx.say(\"wait fail \" .. err)\n                                else\n                                        ngx.say(\"wait succed\")\n                                end\n                        end\n\n                }\n        }\n\n        location /flow/maxconcurrent {\n                access_by_lua_block {\n                        local slock = require(\"slock\")\n                        local client = slock:get(\"lock1\")\n                        local flow_key = \"flow:maxconcurrent\"\n                        local args = ngx.req.get_uri_args()\n                        for key, val in pairs(args) do\n                                if key == \"flow_key\" then\n                                        flow_key = val\n                                end\n                        end\n                        local lock = client:newMaxConcurrentFlow(flow_key, 10, 5, 60)\n                        local ok, err = lock:acquire()\n                        if not ok then\n                                ngx.say(\"acquire error:\" .. err)\n                                ngx.exit(ngx.HTTP_OK)\n                        else\n                                ngx.ctx.lock1 = lock\n                        end\n                }\n\n                echo \"hello world\";\n\n                log_by_lua_block {\n                        local lock = ngx.ctx.lock1\n                        if lock ~= nil then\n                                local ok, err = lock:release()\n                                if not ok then\n                                        ngx.log(ngx.ERR, \"slock release error:\" .. err)\n                                end\n                        end\n                }\n        }\n\n        location /flow/tokenbucket {\n                access_by_lua_block {\n                        local slock = require(\"slock\")\n                        local client = slock:get(\"lock1\")\n                        local flow_key = \"flow:tokenbucket\"\n                        local args = ngx.req.get_uri_args()\n                        for key, val in pairs(args) do\n                                if key == \"flow_key\" then\n                                        flow_key = val\n                                end\n                        end\n                        local lock = client:newTokenBucketFlow(flow_key, 10, 5, 60)\n                        local ok, err = lock:acquire()\n                        if not ok then\n                                ngx.say(\"acquire error:\" .. err)\n                                ngx.exit(ngx.HTTP_OK)\n                        end\n                }\n\n                echo \"hello world\";\n        }\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsnower%2Fslock-lua-nginx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsnower%2Fslock-lua-nginx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsnower%2Fslock-lua-nginx/lists"}