数据结构— —队列企业级web服务器队列的应用

简介: 数据结构— —队列企业级web服务器队列的应用

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

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


具体实现方案:

完整代码:

nginx_queue.h

#ifndef _NGX_QUEUE_H_INCLUDED_
#define _NGX_QUEUE_H_INCLUDED_
typedef struct ngx_queue_s ngx_queue_t;
struct ngx_queue_s 
{
    ngx_queue_t *prev;
    ngx_queue_t *next;
};
#define ngx_queue_init(q)
(q)->prev = q;
(q)->next = q;
#define ngx_queue_empty(h)
(h == (h)->prev)
#define ngx_queue_insert_head(h, x)
(x)->next = (h)->next;
(x)->next->prev = x;
(x)->prev = h;
(h)->next = x;
#define ngx_queue_insert_after ngx_queue_insert_head
#define ngx_queue_insert_tail(h, x)
(x)->prev = (h)->prev;
(x)->prev->next = x;
(x)->next = h;
(h)->prev = x;
#define ngx_queue_head(h)
(h)->next;
#define ngx_queue_last(h)
(h)->prev
#define ngx_queue_sentinel(h)
(h)
#define ngx_queue_next(q)
(q)->next
#define ngx_queue_prev(q)
(q)->prev
#define ngx_queue_remove(x)
(x)->next->prev = (x)->prev;
(x)->prev->next = (x)->next
#define ngx_queue_data(q, type, link)
(type *) ((char *) q - offsetof(type, link))
#endif


Nginx_双向循环队列.cpp

#include <Windows.h>
#include <stdlib.h>
#include <iostream>
#include "nginx_queue.h"
#include <time.h>
using namespace std;
typedef struct ngx_cached_open_file_s 
{
    //其它属性省略...
    int fd;
    ngx_queue_t queue;
}ngx_cached_file_t;
typedef struct 
{
    //其它属性省略...
    ngx_queue_t expire_queue;
    //其它属性省略...
} ngx_open_file_cache_t;
int main(void)
{
    ngx_open_file_cache_t *cache = new ngx_open_file_cache_t;
    ngx_queue_t *q;
    ngx_queue_init(&cache->expire_queue);
    //1. 模拟文件模块,增加打开的文件到缓存中
    for(int i=0; i<10; i++)
    {
        ngx_cached_file_t *e = new ngx_cached_file_t;
        e->fd = i;
        ngx_queue_insert_head(&cache->expire_queue, &e->queue);
}
    //遍历队列
    for(q=cache->expire_queue.next;
    q!=ngx_queue_sentinel(&cache->expire_queue); 
    q=q->next)
    {
        printf("队列中的元素:%d\n", (ngx_queue_data(q,ngx_cached_file_t, queue))->fd);
    }
    //模拟缓存的文件到期,执行出列操作
    while(!ngx_queue_empty(&cache->expire_queue))
    {
        q=ngx_queue_last(&cache->expire_queue);
        ngx_cached_file_t *cached_file = ngx_queue_data(q,
        ngx_cached_file_t, queue);
        printf("出队列中的元素:%d\n", cached_file->fd);
        ngx_queue_remove(q);
        delete(cached_file);
    }
    system("pause");
    return 0;
}


相关文章
|
17天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
91 9
|
6天前
|
存储 缓存 前端开发
如何优化 SSR 应用以减少服务器压力
优化SSR应用以减少服务器压力,可采用代码分割、缓存策略、数据预加载、服务端性能优化、使用CDN、SSR与SSG结合、限制并发请求、SSR与CSR平滑切换、优化前端资源及利用框架特性等策略。这些方法能有效提升性能和稳定性,同时保证用户体验。
|
27天前
|
机器学习/深度学习 人工智能 运维
企业内训|LLM大模型在服务器和IT网络运维中的应用-某日企IT运维部门
本课程是为某在华日资企业集团的IT运维部门专门定制开发的企业培训课程,本课程旨在深入探讨大型语言模型(LLM)在服务器及IT网络运维中的应用,结合当前技术趋势与行业需求,帮助学员掌握LLM如何为运维工作赋能。通过系统的理论讲解与实践操作,学员将了解LLM的基本知识、模型架构及其在实际运维场景中的应用,如日志分析、故障诊断、网络安全与性能优化等。
56 2
|
9天前
|
弹性计算 开发工具 git
2分钟在阿里云ECS控制台部署个人应用(图文示例)
作为一名程序员,我在部署托管于Github/Gitee的代码到阿里云ECS服务器时,经常遇到繁琐的手动配置问题。近期,阿里云ECS控制台推出了一键构建部署功能,简化了这一过程,支持Gitee和GitHub仓库,自动处理git、docker等安装配置,无需手动登录服务器执行命令,大大提升了部署效率。本文将详细介绍该功能的使用方法和适用场景。
2分钟在阿里云ECS控制台部署个人应用(图文示例)
|
12天前
|
弹性计算 运维
新 企业级ECS集群运维管理训练营 打卡学习领好礼
新 企业级ECS集群运维管理训练营 打卡学习领好礼
52 3
|
19天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
192 2
|
19天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
23天前
|
存储 安全 关系型数据库
Linux系统在服务器领域的应用与优势###
本文深入探讨了Linux操作系统在服务器领域的广泛应用及其显著优势。通过分析其开源性、安全性、稳定性和高效性,揭示了为何Linux成为众多企业和开发者的首选服务器操作系统。文章还列举了Linux在服务器管理、性能优化和社区支持等方面的具体优势,为读者提供了全面而深入的理解。 ###
|
24天前
|
存储 缓存 前端开发
如何优化 SSR 应用以减少服务器压力?
如何优化 SSR 应用以减少服务器压力?
|
1月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。