Nginx共享內(nèi)存剖析及開(kāi)源項(xiàng)目分享

1. 介紹

nginx共享內(nèi)存是利用mmap將內(nèi)容存儲(chǔ)在內(nèi)存中以及使用自旋鎖。當(dāng)master啟動(dòng)的時(shí)候,根據(jù)相應(yīng)的指令去初始化共享內(nèi)存。利用共享內(nèi)存實(shí)現(xiàn)一個(gè)輕量級(jí)的k/v系統(tǒng)。

2. 共享內(nèi)存內(nèi)部結(jié)構(gòu)

2.1 全局變量ngx_cycle結(jié)構(gòu)

image.png

2.2 ngx_cycle結(jié)構(gòu)

image.png

2.3 ngx_zone_s結(jié)構(gòu)

image.png

2.4 ngx_shmtx_t結(jié)構(gòu)

image.png

2.5 ngx_slab_pool_t結(jié)構(gòu)

image.png

2.6 ngx_slab_pool_t內(nèi)存分配

image.png

3. 項(xiàng)目介紹

根據(jù)nginx配置文件來(lái)動(dòng)態(tài)的添加共享內(nèi)存。開(kāi)源項(xiàng)目地址https://github.com/lidaohang/ngx_shm_dict

  • ngx_shm_dict
    核心模塊, 共享內(nèi)存核心模塊(紅黑樹(shù),隊(duì)列)
  • ngx_shm_dict_manager
    管理以及主動(dòng)過(guò)期策略,支持redis協(xié)議等。
    添加定時(shí)器事件,定時(shí)的清除共享內(nèi)存中過(guò)期的key
    添加讀事件,支持redis協(xié)議,通過(guò)redis-cli get,set,del,ttl
  • ngx_shm_dict_view
    共享內(nèi)存查看

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);
//設(shè)置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);
//設(shè)置key過(guò)期時(shí)間
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);
//計(jì)數(shù)器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);
//清空共享內(nèi)存
int ngx_shm_dict_handler_flush_all(ngx_shm_zone_t* zone_t);

5. 內(nèi)部流程

5.1 ngx_shared_memory_add

image.png
image.png

5.2 ngx_init_zone_pool

image.png

5.3 添加共享內(nèi)存k/v

image.png

5.4 查詢共享內(nèi)存k/v

image.png

5.5 回收共享內(nèi)存k/v

image.png

5.6 內(nèi)部模塊使用共享內(nèi)存

image.png

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Nginx入門(mén) 本文目的是學(xué)習(xí)Nginx+Lua開(kāi)發(fā),對(duì)于Nginx基本知識(shí)可以參考如下文章: nginx啟動(dòng)、關(guān)...
    小梅飄雪閱讀 4,460評(píng)論 0 6
  • 轉(zhuǎn)載:可能是目前最詳細(xì)的Redis內(nèi)存模型及應(yīng)用解讀 Redis是目前最火爆的內(nèi)存數(shù)據(jù)庫(kù)之一,通過(guò)在內(nèi)存中讀寫(xiě)數(shù)據(jù)...
    jwnba24閱讀 694評(píng)論 0 4
  • 運(yùn)營(yíng)研發(fā)團(tuán)隊(duì) 施洪寶 一. 概述 應(yīng)用程序的內(nèi)存可以簡(jiǎn)單分為堆內(nèi)存,棧內(nèi)存。對(duì)于棧內(nèi)存而言,在函數(shù)編譯時(shí),編譯器會(huì)...
    LNMPR源碼研究閱讀 493評(píng)論 0 0
  • 在這個(gè)看臉的社會(huì),就算你長(zhǎng)得不是很出眾,但只要你把自己收拾的干干凈凈、穿著得體、妝容精致,走在路上時(shí),路人的眼光自...
    白開(kāi)水_e0cd閱讀 460評(píng)論 0 0
  • 大家好! 我是太陽(yáng)! 我又從簡(jiǎn)書(shū)出現(xiàn)啦! 今天,我們的“蓮藕”畫(huà)完啦! 掌聲鼓勵(lì)一下! 各位同學(xué)本來(lái)在聽(tīng)說(shuō)可以不勾...
    大點(diǎn)陽(yáng)閱讀 176評(píng)論 0 0

友情鏈接更多精彩內(nèi)容