224 lines
5.1 KiB
Markdown
224 lines
5.1 KiB
Markdown
# 会议缓存服务使用指南
|
|
|
|
## 概述
|
|
`meetingCacheService` 是一个独立的缓存服务,用于缓存会议列表的查询结果,减少不必要的网络请求,提升用户体验。
|
|
|
|
## 导入
|
|
|
|
```javascript
|
|
import meetingCacheService from '../services/meetingCacheService';
|
|
```
|
|
|
|
## 核心API
|
|
|
|
### 1. 生成过滤器键
|
|
```javascript
|
|
const filterKey = meetingCacheService.generateFilterKey(
|
|
filterType, // 'all' | 'created' | 'attended'
|
|
searchQuery, // 搜索关键词字符串
|
|
selectedTags // 标签数组 ['tag1', 'tag2']
|
|
);
|
|
```
|
|
|
|
### 2. 获取缓存数据
|
|
|
|
#### 获取单页缓存
|
|
```javascript
|
|
const cachedPage = meetingCacheService.getPage(filterKey, pageNumber);
|
|
// 返回: { meetings: [...], pagination: {...} } 或 null
|
|
```
|
|
|
|
#### 获取所有页缓存
|
|
```javascript
|
|
const allCached = meetingCacheService.getAllPages(filterKey);
|
|
// 返回: { pages: { 1: {...}, 2: {...} }, timestamp: number } 或 null
|
|
```
|
|
|
|
### 3. 设置缓存
|
|
```javascript
|
|
meetingCacheService.setPage(
|
|
filterKey,
|
|
pageNumber,
|
|
meetingsArray,
|
|
paginationObject
|
|
);
|
|
```
|
|
|
|
### 4. 清除缓存
|
|
|
|
#### 清除所有缓存
|
|
```javascript
|
|
meetingCacheService.clearAll();
|
|
```
|
|
|
|
#### 清除特定过滤器
|
|
```javascript
|
|
meetingCacheService.clearFilter(filterKey);
|
|
```
|
|
|
|
#### 清除匹配模式的缓存
|
|
```javascript
|
|
// 清除所有包含 'created' 的过滤器缓存
|
|
meetingCacheService.clearPattern('created');
|
|
```
|
|
|
|
### 5. 检查缓存状态
|
|
|
|
#### 检查过滤器是否存在
|
|
```javascript
|
|
const hasFilter = meetingCacheService.hasFilter(filterKey);
|
|
// 返回: boolean
|
|
```
|
|
|
|
#### 检查特定页是否存在
|
|
```javascript
|
|
const hasPage = meetingCacheService.hasPage(filterKey, pageNumber);
|
|
// 返回: boolean
|
|
```
|
|
|
|
### 6. 获取统计信息
|
|
```javascript
|
|
const stats = meetingCacheService.getStats();
|
|
// 返回: {
|
|
// filterCount: number, // 缓存的过滤器数量
|
|
// totalPages: number, // 总页数
|
|
// totalMeetings: number, // 总会议数
|
|
// cacheSize: number // 估算大小(KB)
|
|
// }
|
|
```
|
|
|
|
## 使用示例
|
|
|
|
### 完整的数据获取流程
|
|
|
|
```javascript
|
|
const fetchMeetings = async (page = 1, isLoadMore = false) => {
|
|
try {
|
|
// 1. 生成过滤器键
|
|
const filterKey = meetingCacheService.generateFilterKey(
|
|
filterType,
|
|
searchQuery,
|
|
selectedTags
|
|
);
|
|
|
|
// 2. 检查缓存
|
|
if (!isLoadMore) {
|
|
// 新查询,检查第一页缓存
|
|
const allCached = meetingCacheService.getAllPages(filterKey);
|
|
if (allCached && allCached.pages[1]) {
|
|
console.log('Using cached data');
|
|
setMeetings(allCached.pages[1].meetings);
|
|
setPagination(allCached.pages[1].pagination);
|
|
return;
|
|
}
|
|
} else {
|
|
// 加载更多,检查该页缓存
|
|
const cachedPage = meetingCacheService.getPage(filterKey, page);
|
|
if (cachedPage) {
|
|
console.log('Using cached page:', page);
|
|
setMeetings(prev => [...prev, ...cachedPage.meetings]);
|
|
setPagination(cachedPage.pagination);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// 3. 没有缓存,从服务器获取
|
|
setLoading(true);
|
|
const response = await apiClient.get('/api/meetings', { params });
|
|
|
|
// 4. 缓存数据
|
|
meetingCacheService.setPage(
|
|
filterKey,
|
|
page,
|
|
response.data.meetings,
|
|
response.data.pagination
|
|
);
|
|
|
|
// 5. 更新UI
|
|
if (isLoadMore) {
|
|
setMeetings(prev => [...prev, ...response.data.meetings]);
|
|
} else {
|
|
setMeetings(response.data.meetings);
|
|
}
|
|
setPagination(response.data.pagination);
|
|
|
|
} catch (err) {
|
|
console.error('Error:', err);
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
```
|
|
|
|
### 数据变更时清除缓存
|
|
|
|
```javascript
|
|
const handleDeleteMeeting = async (meetingId) => {
|
|
await apiClient.delete(`/api/meetings/${meetingId}`);
|
|
|
|
// 清除所有缓存
|
|
meetingCacheService.clearAll();
|
|
|
|
// 重新加载数据
|
|
await fetchMeetings(1, false);
|
|
};
|
|
```
|
|
|
|
## 缓存策略
|
|
|
|
### 缓存时间
|
|
- **TTL**: 5分钟
|
|
- 超过5分钟的缓存会自动失效并被清除
|
|
|
|
### 缓存结构
|
|
```javascript
|
|
{
|
|
"filterKey1": {
|
|
pages: {
|
|
1: { meetings: [...], pagination: {...} },
|
|
2: { meetings: [...], pagination: {...} }
|
|
},
|
|
timestamp: 1234567890
|
|
},
|
|
"filterKey2": {
|
|
...
|
|
}
|
|
}
|
|
```
|
|
|
|
### 过滤器键格式
|
|
格式: `filterType|searchQuery|tags`
|
|
示例:
|
|
- `all||` - 全部会议,无搜索,无标签
|
|
- `created||` - 我创建的会议
|
|
- `all|meeting|tag1,tag2` - 全部会议,搜索"meeting",标签"tag1,tag2"
|
|
|
|
## 调试工具
|
|
|
|
在开发环境下,控制台会自动注册调试命令:
|
|
|
|
```javascript
|
|
// 查看缓存统计
|
|
window.meetingCache.stats()
|
|
|
|
// 查看详细信息
|
|
window.meetingCache.info()
|
|
|
|
// 清除所有缓存
|
|
window.meetingCache.clear()
|
|
```
|
|
|
|
## 最佳实践
|
|
|
|
1. **及时清除缓存**: 数据变更(增删改)后立即清除相关缓存
|
|
2. **合理使用**: 只缓存频繁访问的数据
|
|
3. **监控缓存大小**: 定期检查缓存占用情况
|
|
4. **错误处理**: 缓存失败时应该降级到正常的网络请求
|
|
|
|
## 性能优势
|
|
|
|
- ✅ **减少网络请求**: 相同查询直接从内存读取
|
|
- ✅ **即时响应**: 缓存命中时响应 < 10ms
|
|
- ✅ **降低服务器负载**: 减少重复查询
|
|
- ✅ **提升用户体验**: 无刷新切换过滤条件
|