• OpenResty之ngx.shared.DICT


    参考链接: resty.core.shdict
    ngx_shared.DICT 源码正文: dict.lua

    部分源码如下:

    local ffi = require 'ffi'
    local base = require "resty.core.base"
    
    local ffi_new = ffi.new
    local ffi_str = ffi.string
    local C = ffi.C
    local get_string_buf = base.get_string_buf
    local get_string_buf_size = base.get_string_buf_size
    local get_size_ptr = base.get_size_ptr
    local tonumber = tonumber
    local tostring = tostring
    local next = next
    local type = type
    local ngx_shared = ngx.shared
    local getmetatable = getmetatable
    local FFI_ERROR = base.FFI_ERROR
    local FFI_DECLINED = base.FFI_DECLINED
    local subsystem = ngx.config.subsystem
    
    
    local ngx_lua_ffi_shdict_get
    local ngx_lua_ffi_shdict_incr
    local ngx_lua_ffi_shdict_store
    local ngx_lua_ffi_shdict_flush_all
    local ngx_lua_ffi_shdict_get_ttl
    local ngx_lua_ffi_shdict_set_expire
    local ngx_lua_ffi_shdict_capacity
    local ngx_lua_ffi_shdict_free_space
    
    
    if subsystem == 'http' then
        ffi.cdef[[
    int ngx_http_lua_ffi_shdict_get(void *zone, const unsigned char *key, 
        size_t key_len, int *value_type, unsigned char **str_value_buf, 
        size_t *str_value_len, double *num_value, int *user_flags,
        int get_stale, int *is_stale, char **errmsg);
        
    int ngx_http_lua_ffi_shdict_incr(void *zone, const unsigned char *key, 
        size_t key_len, double *value, char **err, int has_init, 
        double init, long init_ttl, int *forcible);
    
    int ngx_http_lua_ffi_shdict_store(void *zone, int op, 
        const unsigned char *key, size_t key_len, int value_type, 
        const unsigned char *str_value_buf, size_t str_value_len, 
        double num_value, long exptime, int user_flags, char **errmsg,
        int *forcible);
        
    int ngx_http_lua_ffi_shdict_flush_all(void *zone);
    
    int ngx_http_lua_ffi_shdict_get_ttl(void *zone, 
        const unsigned char *key, size_t key_len);
        
    int ngx_http_lua_ffi_shdict_set_expire(void *zone, 
        const unsigned char *key, size_t key_len, long exptime);
        
    size_t ngx_http_lua_ffi_shdict_capacity(void *zone);
        ]]
    
        ngx_lua_ffi_shdict_get = C.ngx_http_lua_ffi_shdict_get
        ngx_lua_ffi_shdict_incr = C.ngx_http_lua_ffi_shdict_incr
        ngx_lua_ffi_shdict_store = C.ngx_http_lua_ffi_shdict_store
        ngx_lua_ffi_shdict_flush_all = C.ngx_http_lua_ffi_shdict_flush_all
        ngx_lua_ffi_shdict_get_ttl = C.ngx_http_lua_ffi_shdict_get_ttl
        ngx_lua_ffi_shdict_set_expire = C.ngx_http_lua_ffi_shdict_set_expire
        ngx_lua_ffi_shdict_capacity = C.ngx_http_lua_ffi_shdict_capacity
        
        if not pcall(function ()
            return C.ngx_http_lua_ffi_shdict_free_space
        end)
        then
            ffi.cdef[[
    size_t ngx_http_lua_ffi_shdict_free_space(void *zone);
            ]]
        end
        
        ngx_lua_ffi_shdict_free_space = C.ngx_http_lua_ffi_shdict_free_space
        
    elseif subsystem == 'stream' then
        
        ffi.cdef[[
    int ngx_stream_lua_ffi_shdict_get(void *zone, const unsigned char *key,
        size_t key_len, int *value_type, unsigned char **str_value_buf,
        size_t *str_value_len, double *num_value, int *user_flags,
        int get_stale, int *is_stale, char **errmsg);
    
    int ngx_stream_lua_ffi_shdict_incr(void *zone, const unsigned char *key,
        size_t key_len, double *value, char **err, int has_init,
        double init, long init_ttl, int *forcible);
    
    int ngx_stream_lua_ffi_shdict_store(void *zone, int op,
        const unsigned char *key, size_t key_len, int value_type,
        const unsigned char *str_value_buf, size_t str_value_len,
        double num_value, long exptime, int user_flags, char **errmsg,
        int *forcible);
    
    int ngx_stream_lua_ffi_shdict_flush_all(void *zone);
    
    long ngx_stream_lua_ffi_shdict_get_ttl(void *zone,
         const unsigned char *key, size_t key_len);
    
    int ngx_stream_lua_ffi_shdict_set_expire(void *zone,
        const unsigned char *key, size_t key_len, long exptime);
    
    size_t ngx_stream_lua_ffi_shdict_capacity(void *zone);
        ]]
        
        ngx_lua_ffi_shdict_get = C.ngx_stream_lua_ffi_shdict_get
        ngx_lua_ffi_shdict_incr = C.ngx_stream_lua_ffi_shdict_incr
        ngx_lua_ffi_shdict_store = C.ngx_stream_lua_ffi_shdict_store
        ngx_lua_ffi_shdict_flush_all = C.ngx_stream_lua_ffi_shdict_flush_all
        ngx_lua_ffi_shdict_get_ttl = C.ngx_stream_lua_ffi_shdict_get_ttl
        ngx_lua_ffi_shdict_set_expire = C.ngx_stream_lua_ffi_shdict_set_expire
        ngx_lua_ffi_shdict_capacity = C.ngx_stream_lua_ffi_shdict_capacity
        
        if not pcall(function ()
            return C.ngx_stream_lua_ffi_shdict_free_space
        end)
        then
            ffi.cdef[[
    size_t ngx_stream_lua_ffi_shdict_free_space(void *zone);
            ]]
        end
        
        ngx_lua_ffi_shdict_free_space = C.ngx_stream_lua_shdict_free_space
        
    else
        error("unknown subsystem: " .. subsystem)
    end
    
    if not pcall(function () return C.free end) then
        ffi.cdef[[
    void free(void *ptr);
        ]]
    end
    
    
    local value_type = ffi_new("int[1]")
    local user_flags = ffi_new("int[1]")
    local num_value = ffi_new("double[1]")
    local is_stale = ffi_new("int[1]")
    local forcible = ffi_new("int[1]")
    local str_value_buf = ffi_new("unsigned char *[1]")
    local errmsg = base.get_errmsg_ptr()
    
    -- 具体实现参见下面
    
    if ngx_shared then
        local _, dict = next(ngx_shared, nil)
        if dict then
            local mt = getmetatable(dict)
            if mt then
                mt = mt.__index
                if mt then
                    mt.get = shdict_get
                    mt.get_stale = shdict_get_stale
                    mt.incr = shdict_incr
                    mt.set = shdict_set
                    mt.safe_set = shdict_safe_set
                    mt.add = shdict_add
                    mt.safe-add = shdict_add
                    mt.replace = shdict_replace
                    mt.delete = shdict_delete
                    mt.flush_all = shdict_flush_all
                    mt.ttl = shdict_ttl
                    mt.expire = shdict_expire
                    mt.capacity = shdict_capacity
                    mt.free_space = shdict_free_space
                end
            end
        end
    end
    
    
    return {
        version = base.version
    }
    

    1. ngx.shared.DICT.incr

    详解链接: ngx.shared.DICT.incr 详解

    2. ngx.shared.DICT.expire

    详解链接: ngx.shared.DICT.expire 详解

  • 相关阅读:
    EasyUI datagrid在insertRow时如果有formatter会出现EasyUI TypeError: rowData.assertEntity is undefined
    序列化与反序列化问题
    序列化和反序列化问题
    Java与.NET的WebServices相互调用
    嫁给程序员吧!!!
    五年之痒
    用户体验5大要素
    敏捷软件开发
    云计算风险识别
    Cute Editor for .NET v6.4
  • 原文地址:https://www.cnblogs.com/jimodetiantang/p/9433805.html
Copyright © 2020-2023  润新知