天天看點

Nginx共享記憶體剖析及開源項目分享

1. 介紹

nginx共享記憶體是利用mmap将内容存儲在記憶體中以及使用自旋鎖。當master啟動的時候,根據相應的指令去初始化共享記憶體。利用共享記憶體實作一個輕量級的k/v系統。

2. 共享記憶體内部結構

2.1 全局變量ngx_cycle結構

Nginx共享記憶體剖析及開源項目分享

image.png

2.2 ngx_cycle結構

Nginx共享記憶體剖析及開源項目分享

2.3 ngx_zone_s結構

Nginx共享記憶體剖析及開源項目分享

2.4 ngx_shmtx_t結構

Nginx共享記憶體剖析及開源項目分享

2.5 ngx_slab_pool_t結構

Nginx共享記憶體剖析及開源項目分享

2.6 ngx_slab_pool_t記憶體配置設定

Nginx共享記憶體剖析及開源項目分享

3. 項目介紹

根據nginx配置檔案來動态的添加共享記憶體。開源項目位址https://github.com/lidaohang/ngx_shm_dict

  • ngx_shm_dict

    核心子產品, 共享記憶體核心子產品(紅黑樹,隊列)

  • ngx_shm_dict_manager

    管理以及主動過期政策,支援redis協定等。

    添加定時器事件,定時的清除共享記憶體中過期的key

    添加讀事件,支援redis協定,通過redis-cli get,set,del,ttl

  • ngx_shm_dict_view

    共享記憶體檢視

4. 接口介紹

//擷取k/v
int ngx_shm_dict_handler_get(ngx_shm_zone_t* zone_t,ngx_str_t *key, ngx_str_t *value,uint32_t *exptime);
//設定k/v
int ngx_shm_dict_handler_set(ngx_shm_zone_t* zone_t,ngx_str_t *key, ngx_str_t *value,uint32_t exptime);
//設定key過期時間
int ngx_shm_dict_handler_set_exptime(ngx_shm_zone_t* zone_t, ngx_str_t* key, uint32_t exptime);
//删除k/v
int ngx_shm_dict_handler_delete(ngx_shm_zone_t* zone_t,ngx_str_t *key);
//計數器k/v
int ngx_shm_dict_handler_incr_int(ngx_shm_zone_t* zone_t,ngx_str_t *key, int count,uint32_t exptime,int64_t* res);
//清空共享記憶體
int ngx_shm_dict_handler_flush_all(ngx_shm_zone_t* zone_t);      

5. 内部流程

5.1 ngx_shared_memory_add

Nginx共享記憶體剖析及開源項目分享
Nginx共享記憶體剖析及開源項目分享

5.2 ngx_init_zone_pool

Nginx共享記憶體剖析及開源項目分享

5.3 添加共享記憶體k/v

Nginx共享記憶體剖析及開源項目分享

5.4 查詢共享記憶體k/v

Nginx共享記憶體剖析及開源項目分享

5.5 回收共享記憶體k/v

Nginx共享記憶體剖析及開源項目分享

5.6 内部子產品使用共享記憶體

Nginx共享記憶體剖析及開源項目分享

6. 安裝使用

git clone https://github.com/lidaohang/ngx_shm_dict
git clone https://github.com/lidaohang/ngx_shm_manager
git clone https://github.com/lidaohang/ngx_shm_dict_view

patch -p1 < ngx_shm_manager/nginx-1.4.1-1.58-proc-module.patch

./configure --add-module=ngx_shm_dict --add-module=ngx_shm_dict_view --add-module=ngx_shm_dict_manager
make && make install      

7. Example

processes {
    process ngx_shm_dict_manager {
        ngx_shm_dict_name test;
        interval 3s;
        delay_start 300ms;
        listen 8010;
    }
}

    ngx_shm_dict_zone zone=test max_size=2048m;
    ngx_shm_dict_zone zone=test1 max_size=2048m;
    
    ngx_shm_dict_zone zone=test2 max_size=2048m;
    ngx_shm_dict_zone zone=test3 max_size=2048m;


    server {
        listen       8011;
        server_name  localhost;

    location / {
        ngx_shm_dict_view;
    }
}      

8. Test

curl "http://127.0.0.1:8011/set?zone=test&key=abc&value=123&exptime=100"
curl "http://127.0.0.1:8011/get?zone=test&key=abc"
curl "http://127.0.0.1:8011/del?zone=test&key=abc"

redis-cli get abc
redis-cli set abc 123
redis-cli del abc
redis-cli ttl abc      

繼續閱讀