首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Nginx共享内存剖析及开源项目分享

Nginx共享内存剖析及开源项目分享

作者头像
Lucien168
发布2020-07-18 18:42:37
发布2020-07-18 18:42:37
1.1K0
举报
文章被收录于专栏:分布式存储分布式存储

1. 介绍

nginx共享内存是利用mmap将内容存储在内存中以及使用自旋锁。当master启动的时候,根据相应的指令去初始化共享内存。利用共享内存实现一个轻量级的k/v系统。

2. 共享内存内部结构

2.1 全局变量ngx_cycle结构

image.png

2.2 ngx_cycle结构

image.png

2.3 ngx_zone_s结构

image.png

2.4 ngx_shmtx_t结构

image.png

2.5 ngx_slab_pool_t结构

image.png

2.6 ngx_slab_pool_t内存分配

image.png

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. 接口介绍

代码语言:javascript
复制
//获取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

image.png

image.png

5.2 ngx_init_zone_pool

image.png

5.3 添加共享内存k/v

image.png

5.4 查询共享内存k/v

image.png

5.5 回收共享内存k/v

image.png

5.6 内部模块使用共享内存

image.png

6. 安装使用

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 介绍
  • 2. 共享内存内部结构
    • 2.1 全局变量ngx_cycle结构
    • 2.2 ngx_cycle结构
    • 2.3 ngx_zone_s结构
    • 2.4 ngx_shmtx_t结构
    • 2.5 ngx_slab_pool_t结构
    • 2.6 ngx_slab_pool_t内存分配
  • 3. 项目介绍
  • 4. 接口介绍
  • 5. 内部流程
    • 5.1 ngx_shared_memory_add
    • 5.2 ngx_init_zone_pool
    • 5.3 添加共享内存k/v
    • 5.4 查询共享内存k/v
    • 5.5 回收共享内存k/v
    • 5.6 内部模块使用共享内存
  • 6. 安装使用
  • 7. Example
  • 8. Test
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档