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