Files
2026-07-18 16:39:01 +08:00

93 lines
3.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* cache.h — Web服务器 LRU 缓存模块
*
* 设计思想:
* 使用 哈希表 + 双向链表 实现 O(1) 的查找、插入和淘汰操作。
* 哈希表提供快速键值查找,双向链表维护 LRU 访问顺序。
* 最近被访问的节点移动到链表头部 (MRU位置)
* 链表尾部的节点是最久未被访问的 (LRU位置),淘汰时优先移除。
*
* 数据结构:
* cache_entry: 单个缓存条目 (文件名、文件内容、大小、MIME类型、时间戳)
* cache_t: 缓存管理器 (哈希表桶数组、链表头尾、统计计数器)
*
* 主要操作:
* cache_init(max_size): 初始化缓存,设置最大条目数
* cache_lookup(url, buf, size, type): 查找缓存,命中时拷贝数据并返回 1
* cache_insert(url, data, size, type): 插入缓存,必要时淘汰 LRU 条目
* cache_free(): 释放所有缓存内存
*/
#ifndef _CACHE_H_
#define _CACHE_H_
#include <time.h>
#include <pthread.h>
/* 缓存条目 */
typedef struct cache_entry {
char *url; /* 请求 URL (作为键) */
char *data; /* 文件内容 */
long size; /* 文件大小 */
char filetype[64]; /* MIME 类型 */
struct timespec timestamp; /* 最后访问时间 */
struct cache_entry *prev; /* 双向链表前驱 */
struct cache_entry *next; /* 双向链表后继 */
struct cache_entry *hnext; /* 哈希桶内链表 (冲突链) */
} cache_entry_t;
/* 缓存管理器 */
typedef struct {
cache_entry_t **buckets; /* 哈希桶数组 */
int num_buckets; /* 哈希桶数量 */
int max_size; /* 最大条目数 */
int cur_size; /* 当前条目数 */
cache_entry_t *head; /* LRU 链表头 (最近使用) */
cache_entry_t *tail; /* LRU 链表尾 (最久未使用) */
pthread_mutex_t lock; /* 线程安全锁 */
/* 统计信息 */
long long hits; /* 缓存命中次数 */
long long misses; /* 缓存未命中次数 */
long long evictions; /* 淘汰次数 */
long long bytes_served; /* 从缓存服务的字节数 */
} cache_t;
/**
* cache_init — 初始化 LRU 缓存
* @max_size: 最大缓存条目数
* @return: 指向 cache_t 的指针,失败返回 NULL
*/
cache_t *cache_init(int max_size);
/**
* cache_lookup — 在缓存中查找 URL
* @cache: 缓存管理器指针
* @url: 请求的 URL 键
* @data: 输出参数,命中时指向缓存数据的拷贝 (调用者需 free)
* @size: 输出参数,数据大小
* @filetype: 输出参数MIME 类型
* @return: 1=命中, 0=未命中
*/
int cache_lookup(cache_t *cache, const char *url,
char **data, long *size, char *filetype);
/**
* cache_insert — 向缓存插入新条目
* @cache: 缓存管理器指针
* @url: URL 键
* @data: 文件内容 (缓存会拷贝一份)
* @size: 文件大小
* @filetype: MIME 类型
* @return: 0=成功, -1=失败
*/
int cache_insert(cache_t *cache, const char *url,
const char *data, long size, const char *filetype);
/**
* cache_free — 释放所有缓存资源
*/
void cache_free(cache_t *cache);
#endif /* _CACHE_H_ */