Nginx共享内存剖析及开源项目分享
时间:2022-07-22
本文章向大家介绍Nginx共享内存剖析及开源项目分享,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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. 接口介绍
//获取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. 安装使用
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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- WAF案例:为什么curl可以wget不行?
- React进阶(4)-拆分Redux-将store,Reducer,action,actionTypes独立管理
- React进阶(5)-分离容器组件,UI组件(无状态组件)
- React进阶(6)-react-redux的使用
- Kubernetes 1.19.0——服务svc(2)
- Android菜单的定义及ActionBar的实现
- 3分钟短文:Laravel表单验证的“指挥中心”:FormRequest
- 10 种跨域解决方案(附终极方案)
- 架构师教你kill祖传石山代码重复/大量ifelse
- TKE集群,一次磁盘挂载问题处理
- Linux Load Average详解
- 5. Bean Validation声明式验证四大级别:字段、属性、容器元素、类
- 使用Docker镜像
- Qt音视频开发39-人脸识别在线版
- 前端学数据结构与算法(九):常见五种排序算法的实现及其优缺点