Files

93 lines
3.2 KiB
C
Raw Permalink Normal View History

2026-07-18 16:39:01 +08:00
/**
* 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_ */