在高并发 HTTP 反向代理服务器 Nginx 中,存在着一个跟性能息息相关的模块 - 文件缓存。

                              

经常访问到的文件会被 nginx 从磁盘缓存到内存,这样可以极大的提高 Nginx 的并发能力,不过因为内存的限制,当缓存的文件数达到一定程度的时候就会采取淘汰机制,优先淘汰进入时间比较久或是最近访问很少(LRU)的队列文件。

具体实现方案:

1. 使用双向循环队列保存缓存的文件节点,这样可以实现多种淘汰策略:

比如:如果采用淘汰进入时间比较久的策略,就可以使用队列的特性,先进先出

如果要采用按照 LRU,就遍历链表,找到节点删除。

源码实现:

nginx_queue.h

 1 #ifndef _NGX_QUEUE_H_INCLUDED_
2 #define _NGX_QUEUE_H_INCLUDED_
3 typedef struct ngx_queue_s ngx_queue_t;
4
5 struct ngx_queue_s
6 {
7 ngx_queue_t* prev;
8 ngx_queue_t* next;
9 };
10
11 #define ngx_queue_init(q)    \
12 (q)->prev = q;   \
13 (q)->next = q
14 #define ngx_queue_empty(h)    \
15 (h == (h)->prev)
16 #define ngx_queue_insert_head(h, x)\
17 (x)->next = (h)->next;     \
18 (x)->next->prev = x;      \
19 (x)->prev = h;          \
20 (h)->next = x
21 #define ngx_queue_insert_after ngx_queue_insert_head
22 #define ngx_queue_insert_tail(h, x)\
23 (x)->prev = (h)->prev;      \
24 (x)->prev->next = x;       \
25 (x)->next = h;          \
26 (h)->prev = x
27 #define ngx_queue_head(h) \
28 (h)->next
29 #define ngx_queue_last(h) \
30 (h)->prev
31 #define ngx_queue_sentinel(h) \
32 (h)
33 #define ngx_queue_next(q) \
34 (q)->next
35 #define ngx_queue_prev(q) \
36 (q)->prev
37 #define ngx_queue_remove(x) \
38 (x)->next->prev = (x)->prev; \
39 (x)->prev->next = (x)->next
40 #define ngx_queue_data(q, type, link)
41 (type*)((char*)q - offsetof(type, link))
42 #endif

Nginx_双向循环队列.cpp

 1 #include <Windows.h>
2 #include <stdlib.h>
3 #include <iostream>
4 #include "nginx_queue.h"
5 #include <time.h>
6
7 using namespace std;
8
9 typedef struct ngx_cached_open_file_s
10 {
11 //其它属性省略...
12 int fd;
13 ngx_queue_t queue;
14 }ngx_cached_file_t;
15
16 typedef struct
17 {
18 //其它属性省略...
19 ngx_queue_t expire_queue;
20 //其它属性省略...
21 } ngx_open_file_cache_t;
22
23 int main(void)
24 {
25 ngx_open_file_cache_t* cache = new ngx_open_file_cache_t;
26 ngx_queue_t* q;
27 ngx_queue_init(&cache->expire_queue);
28
29 //1. 模拟文件模块,增加打开的文件到缓存中
30 for (int i = 0; i < 10; i++)
31 {
32 ngx_cached_file_t* e = new ngx_cached_file_t;
33 e->fd = i;
34 ngx_queue_insert_head(&cache->expire_queue, &e->queue);
35 }
36
37 //遍历队列
38 for (q = cache->expire_queue.next;q != ngx_queue_sentinel(&cache->expire_queue); q = q->next)
39 {
40 printf("队列中的元素:%d\n", (ngx_queue_data(q, ngx_cached_file_t, queue))->fd);
41 }
42
43 //模拟缓存的文件到期,执行出列操作
44 while (!ngx_queue_empty(&cache->expire_queue))
45 {
46 q = ngx_queue_last(&cache->expire_queue);
47 ngx_cached_file_t* cached_file = ngx_queue_data(q, ngx_cached_file_t, queue);
48 printf("出队列中的元素:%d\n", cached_file->fd);
49 ngx_queue_remove(q);
50 delete(cached_file);
51 }
52 system("pause");
53 return 0;
54 }

==================================================================================================================

应用案例——高并发 WEB 服务器队列的应用的更多相关文章

  1. nginx简介(轻量级开源高并发web服务器:大陆使用者百度、京东、新浪、网易、腾讯、淘宝等)(并发量5w)(一般网站apache够用了,而且稳定)

    nginx简介(轻量级开源高并发web服务器:大陆使用者百度.京东.新浪.网易.腾讯.淘宝等)(并发量5w)(一般网站apache够用了,而且稳定) 一.总结 1.在连接高并发的情况下,Nginx是A ...

  2. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

  3. 转---高并发Web服务的演变——节约系统内存和CPU

    [问底]徐汉彬:高并发Web服务的演变——节约系统内存和CPU 发表于22小时前| 4223次阅读| 来源CSDN| 22 条评论| 作者徐汉彬 问底Web服务内存CPU并发徐汉彬 摘要:现在的Web ...

  4. 高并发web系统设计

    转载自:http://blog.csdn.net/qq_26562641/article/details/53170913 一.一般高并发web系统这里的一般指的是秒杀之类的电子商务系统,比如说小米抢 ...

  5. PHP-学习大规模高并发Web系统架构及开发推荐书籍

    以下书籍内容涵盖大型网站开发中几个关键点:高可用.高性能.分布式.易扩展.如果想对大规模高并发Web系统架构及开发有很系统的学习,可以阅读以下书籍,欢迎补充! 一.<Linux企业集群—用商用硬 ...

  6. 高并发WEB网站优化方案

    一.什么是高并发在互联网时代,所讲的并发.高并发,通常是指并发访问,也就是在某个时间点,有多少个访问同时到来.比如,百度首页同时有1000个人访问,那么也就是并发为1000.通常一个系统的日PV在千万 ...

  7. 高并发Web服务的演变:节约系统内存和CPU

    一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置.虽然现 ...

  8. 高并发 Web 服务的演变:节约系统内存和 CPU

    本文内容 越来越多的并发连接数 Web 前端优化,降低服务端压力 节约 Web 服务端的内存 节约 Web 服务器的 CPU 小结 一,越来越多的并发连接数 现在,Web 系统面对的并发连接数呈现指数 ...

  9. (转)高并发Web服务的演变——节约系统内存和CPU

    一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置.虽然现 ...

随机推荐

  1. rgw的rgw_thread_pool_size配置调整

    前言 在比对rgw的不同前端的区别的时候,官方说civetweb是通过线程池来控制连接的,beast是后面加入了流控相关的,这块一直也没有调整过相关的参数,然后通过ab压测了一下,还是有很明显的区别的 ...

  2. 阿里巴巴已offer:Java实习五面详细面经(附解答)

    1.岗位 Java后台开发实习生 2.时间表 2020/3/18 提交简历 & 测评 2020/3/23 笔试 2020/3/26 简历面 2020/4/11 技术一面 2020/4/14 技 ...

  3. MFC常用函数

    1.MFC的常用函数(只是找了些经常使用的,这里没有的可以CSDN查找,不需要都记住,经常使用自动就会记得) 1)GetDlgItemText(ID ,str)作用: 对话框中获取文本第一个参数为要获 ...

  4. php(tp5)实现分页效果

    public function admin(){ if(request()->isPost()){ //获取第二页的数据传current = 2过来即可 $post['origin'] = in ...

  5. MathType总结编辑括号的类型(中)

    MathType中的符号模板多种多样,能够满足各类用户的使用需求.即使是一些不常用的符号也有相应的模板,因为在工作学习中我们都需要他们,只是有的用的多有的用的少而已,下面我们就一起来看看公式编辑器编辑 ...

  6. 从本质上学会基于HarmonyOS开发Hi3861(主要讲授方法)

    引言:花半秒钟就看透事物本质的人,和花一辈子都看不透事物本质的人,注定是截然不同的命运 做开发也一样,如果您能看透开发的整个过程,就不会出现"学会了某个RTOS的开发,同样的RTOS开发换一 ...

  7. .NET可视化权限功能界面设计

    权限功能是信息系统不可或缺的重要部分,一个优秀的权限设计可以使开发工作事半功倍,给使用者带来良好的使用体验. 企业做生意,都会聘请员工,若是员工数量较多,"权限管理"必不可少,这样 ...

  8. Java基础教程——字节流

    IO流 水流 特点 连续性 逝者如斯夫,不舍昼夜: 方向性 一江春水向东流.水往低处流.百川东到海,何时复西归?少壮不努力,老大徒伤悲! 源头尽头 唯有源头活水来:覆水难收 Java里的IO也有这样的 ...

  9. Spring mvc与springboot

    org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration: viewResolver 类路径文件 把类路径下 ...

  10. 【数据结构】关于前缀树(单词查找树,Trie)

    前缀树的说明和用途 前缀树又叫单词查找树,Trie,是一类常用的数据结构,其特点是以空间换时间,在查找字符串时有极大的时间优势,其查找的时间复杂度与键的数量无关,在能找到时,最大的时间复杂度也仅为键的 ...