{"id":22275881,"url":"https://github.com/zigzagak/lua-shared-dict","last_synced_at":"2026-04-18T11:07:16.396Z","repository":{"id":148036399,"uuid":"176126697","full_name":"ZigzagAK/lua-shared-dict","owner":"ZigzagAK","description":"lua nginx module shared dictionary replacement","archived":false,"fork":false,"pushed_at":"2021-11-26T08:32:35.000Z","size":113,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-08T15:36:10.638Z","etag":null,"topics":["lua","lua-shared-dict","nginx","openresty"],"latest_commit_sha":null,"homepage":"","language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ZigzagAK.png","metadata":{"files":{"readme":"README.markdown","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-03-17T16:13:21.000Z","updated_at":"2021-11-26T08:32:38.000Z","dependencies_parsed_at":"2023-05-28T06:45:50.250Z","dependency_job_id":null,"html_url":"https://github.com/ZigzagAK/lua-shared-dict","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ZigzagAK/lua-shared-dict","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZigzagAK%2Flua-shared-dict","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZigzagAK%2Flua-shared-dict/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZigzagAK%2Flua-shared-dict/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZigzagAK%2Flua-shared-dict/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ZigzagAK","download_url":"https://codeload.github.com/ZigzagAK/lua-shared-dict/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZigzagAK%2Flua-shared-dict/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31966218,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["lua","lua-shared-dict","nginx","openresty"],"created_at":"2024-12-03T14:12:43.654Z","updated_at":"2026-04-18T11:07:16.389Z","avatar_url":"https://github.com/ZigzagAK.png","language":"Perl","funding_links":[],"categories":[],"sub_categories":[],"readme":"Name\n====\n\nlua-shared-dict - replacement for lua_shared_dict standart openresty module.\n\nStatus\n======\n\nThis library is production ready.\n\nDescription\n===========\n\nThis module replaces internal representation and operations lua shared dictionary.  \nShared dictionary LUA C api fully rewrited and extended with ZSET operations and function callbacks.\n\nAlso this module export shared dictionary C API, which may be uset in C modules.\n\nThis module tested with:\n\n- lua-nginx-module: v0.10.15rc1\n- stream-lua-nginx-module: v0.0.7rc1\n\nImportant notice\n================\n\nStructure `ngx_lua_shm_zone_ctx_t` MUST be absolutely matched to standard structure ngx_http_lua_shm_zone_ctx_t (ngx_stream_lua_shm_zone_ctx_t).\n\nFor FFI compatibility next structures in `ngx_lua_shdict_defs.h` MUST be matched to structures defined in standard lua-nginx-module (stream-lua-nginx-module):\n\n- ngx_lua_shdict_node_t\n- ngx_lua_shdict_list_node_t\n- ngx_lua_shdict_shctx_t (head fields)\n\nAdditional API\n==============\n\nzset\n----\n**syntax:** `ok, err = ngx.shared.DICT:zset(key, zkey, val, exptime)`  \n**syntax:** `ok, err = ngx.shared.DICT:zset(key, zkey, fun(old_val), exptime)`\n\nParameter `fun` must return new value or nil to remove zkey.  \nReturns true on success, or nil and a string describing an error otherwise.\n\nzadd\n----\n**syntax:** `ok, err = ngx.shared.DICT:zadd(key, zkey, val, exptime)`  \n**syntax:** `ok, err = ngx.shared.DICT:zadd(key, zkey, fun(), exptime)`s\n\nParameter `fun` must return new value.  \nReturns true on success, or nil and a string describing an error otherwise.\n\nzrem\n----\n**syntax:** `val, err = ngx.shared.DICT:zrem(key, zkey)`\n \nReturns removed value on success, or nil and a string describing an error otherwise.\n\nzget\n----\n**syntax:** `val, err = ngx.shared.DICT:zget(key, zkey)`\n\nReturns value on success, or nil and a string describing an error otherwise.\n\nzgetall\n-------\n**syntax:** `tab, err = ngx.shared.DICT:zgetall(key)`\n\nReturns table with { key, val } on success, or nil and a string describing an error otherwise.\n\nzcard\n-----\n**syntax:** `count, err = ngx.shared.DICT:zcard(key)`\n\nReturns zset items count, or nil and a string describing an error otherwise.\n\nzscan\n-----\n**syntax:** `ok, err = ngx.shared.DICT:zscan(key, fun(zkey, val))`  \n**syntax:** `ok, err = ngx.shared.DICT:zscan(key, fun(zkey, val), lbound)`\n\nScans zset key.  \nOn every step function callback MUST returns boolean flag. If zscan must be stopped return value must be `true`.  \n\nExample:\n```\nngx.shared.DICT:zscan(\"key\", function(k,v)\n  if not k:match(\"^a\") then\n    return true\n  end\n  ...\n  return false\nend, \"a\")\n```\n\nScan started from zkey begins from symbol 'a' and stops if callback returns true.  \n\nReturns true on success, or nil and a string describing an error otherwise.\n\nfun\n---\n**syntax:** `new_val, new_flags = ngx.shared.DICT:fun(key, fun(zkey, val), exptime, flags)`\n\n\n\nExample:\n```\nlocal new_val, new_flags = ngx.shared.DICT:fun(\"key\", function(old_val, old_flags)\n  return new_val, new_flags\nend)\n```\n\nIf `new_val` is nil, then key is removed from dictionary.  \n\nReturns new_val and new_flags on success, or nil and a string describing an error otherwise.\n\nC API\n=====\n\n**ngx_lua_shdict.h:**\n\n```\nngx_shm_zone_t *\nngx_http_lua_add_shared_dict(ngx_conf_t *cf,\n    ngx_str_t name, ngx_str_t size);\n\nngx_shm_zone_t *\nngx_stream_lua_add_shared_dict(ngx_conf_t *cf,\n    ngx_str_t name, ngx_str_t size);\n\nngx_shm_zone_t *ngx_lua_find_zone(u_char *name_data, size_t name_len);\n\nngx_shm_zone_t *\nngx_lua_ffi_shdict_udata_to_zone(void *zone_udata);\n\nvoid ngx_lua_shdict_lock(ngx_shm_zone_t *shm_zone);\n\nvoid ngx_lua_shdict_unlock(ngx_shm_zone_t *shm_zone);\n\nint\nngx_lua_shdict_expire_items(ngx_shm_zone_t *shm_zone, ngx_uint_t n);\n\nngx_int_t ngx_lua_shdict_api_used(ngx_shm_zone_t *shm_zone);\n\ntypedef ngx_int_t (*ngx_lua_get_fun_t)(ngx_lua_value_t *value,\n    int stale, void *userctx);\n\nngx_int_t ngx_lua_shdict_api_fun(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_get_fun_t fun, int64_t exptime,\n        void *userctx);\n\nngx_int_t ngx_lua_shdict_api_fun_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_get_fun_t fun, int64_t exptime,\n        void *userctx);\n\n/* copying structure into value */\nngx_int_t ngx_lua_shdict_api_get(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t *value);\n\n/* value contents the reference (string/userdata) to data */\nngx_int_t ngx_lua_shdict_api_get_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t *value);\n\nlua_Number ngx_lua_shdict_api_incr(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, lua_Number inc, lua_Number def, int exptime);\n\nlua_Number ngx_lua_shdict_api_incr_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, lua_Number inc, lua_Number def, int exptime);\n\nngx_int_t ngx_lua_shdict_api_set(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value, int exptime);\n\nngx_int_t ngx_lua_shdict_api_set_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value, int exptime);\n\nngx_int_t ngx_lua_shdict_api_safe_set(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value, int exptime);\n\nngx_int_t ngx_lua_shdict_api_safe_set_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value, int exptime);\n\nngx_int_t ngx_lua_shdict_api_add(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value, int exptime);\n\nngx_int_t ngx_lua_shdict_api_add_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value, int exptime);\n\nngx_int_t ngx_lua_shdict_api_safe_add(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value, int exptime);\n\nngx_int_t ngx_lua_shdict_api_safe_add_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value, int exptime);\n\nngx_int_t ngx_lua_shdict_api_replace(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value, int exptime);\n\nngx_int_t ngx_lua_shdict_api_replace_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value, int exptime);\n\nngx_int_t ngx_lua_shdict_api_delete(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key);\n\nngx_int_t ngx_lua_shdict_api_delete_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key);\n\nngx_int_t ngx_lua_shdict_api_expire(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, int64_t exptime);\n\nngx_int_t ngx_lua_shdict_api_expire_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, int64_t exptime);\n\nngx_int_t ngx_lua_shdict_api_ttl(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, int64_t *ttl);\n\nngx_int_t ngx_lua_shdict_api_ttl_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, int64_t *ttl);\n\nngx_int_t ngx_lua_shdict_api_rps(ngx_shm_zone_t *shm_zone,\n    uint32_t *count, uint32_t *rps);\n\n/* zset */\n\ntypedef void (*ngx_lua_zset_destructor_t)(void *p, size_t len);\n\nngx_int_t ngx_lua_shdict_api_zset(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_str_t zkey, ngx_lua_value_t value, int exptime,\n        ngx_lua_zset_destructor_t onfree);\n\nngx_int_t ngx_lua_shdict_api_zset_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_str_t zkey, ngx_lua_value_t value, int exptime,\n        ngx_lua_zset_destructor_t onfree);\n\n/* copying structure into value */\nngx_int_t ngx_lua_shdict_api_zget(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_str_t zkey, ngx_lua_value_t *value);\n\n/* value contents the reference (string/userdata) to data */\nngx_int_t ngx_lua_shdict_api_zget_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_str_t zkey, ngx_lua_value_t *value);\n\nngx_int_t ngx_lua_shdict_api_zadd(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_str_t zkey, ngx_lua_value_t value, int exptime,\n        ngx_lua_zset_destructor_t onfree);\n\nngx_int_t ngx_lua_shdict_api_zadd_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_str_t zkey, ngx_lua_value_t value, int exptime,\n        ngx_lua_zset_destructor_t onfree);\n\ntypedef ngx_int_t (*ngx_http_fun_t)(ngx_str_t zkey, ngx_lua_value_t *value,\n    void *userctx);\n\nngx_int_t ngx_lua_shdict_api_zscan(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_http_fun_t fun, ngx_str_t lbound, void *userctx);\n\nngx_int_t ngx_lua_shdict_api_zscan_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_http_fun_t fun, ngx_str_t lbound, void *userctx);\n\nngx_int_t ngx_lua_shdict_api_zrem(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_str_t zkey);\n\nngx_int_t ngx_lua_shdict_api_zrem_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_str_t zkey);\n\nngx_int_t ngx_lua_shdict_api_zcard(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, uint32_t *len);\n\nngx_int_t ngx_lua_shdict_api_zcard_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, uint32_t *len);\n\n/* queue */\n\nngx_int_t ngx_lua_shdict_api_rpush(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value);\n\nngx_int_t ngx_lua_shdict_api_rpush_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value);\n\nngx_int_t ngx_lua_shdict_api_lpush(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value);\n\nngx_int_t ngx_lua_shdict_api_lpush_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t value);\n\nngx_int_t ngx_lua_shdict_api_rpop(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t *value);\n\nngx_int_t ngx_lua_shdict_api_rpop_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t *value);\n\nngx_int_t ngx_lua_shdict_api_lpop(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t *value);\n\nngx_int_t ngx_lua_shdict_api_lpop_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, ngx_lua_value_t *value);\n\nngx_int_t ngx_lua_shdict_api_llen(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, uint32_t *len);\n\nngx_int_t ngx_lua_shdict_api_llen_locked(ngx_shm_zone_t *shm_zone,\n    ngx_str_t key, uint32_t *len);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzigzagak%2Flua-shared-dict","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzigzagak%2Flua-shared-dict","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzigzagak%2Flua-shared-dict/lists"}