141 lines
4.0 KiB
Markdown
141 lines
4.0 KiB
Markdown
# 秀人图片插件 - 缓存功能说明
|
||
|
||
## 概述
|
||
|
||
秀人图片插件现在支持内存缓存功能,可以显著提高图片发送的性能,减少磁盘I/O操作。
|
||
|
||
## 缓存机制
|
||
|
||
### 1. 缓存策略
|
||
- **默认缓存大小**: 10张图片(可配置)
|
||
- **缓存类型**: 内存缓存,存储图片的bytes数据
|
||
- **缓存策略**: LRU(最近最少使用)策略
|
||
- **并发处理**: 使用deque的原子操作,无需额外锁机制
|
||
|
||
### 2. 工作流程
|
||
1. 用户请求图片时,优先从内存缓存中获取
|
||
2. 如果缓存中有图片,直接返回bytes数据
|
||
3. 当缓存中只剩1张图片时,异步触发缓存填充
|
||
4. 如果缓存为空,立即同步填充缓存
|
||
5. 支持回退机制:如果缓存失败,回退到原来的磁盘读取方式
|
||
|
||
### 3. 性能优化
|
||
- **减少磁盘I/O**: 避免频繁的磁盘读取操作
|
||
- **异步填充**: 缓存填充在后台线程进行,不阻塞主流程
|
||
- **智能预加载**: 在缓存即将耗尽时提前填充
|
||
- **内存管理**: 使用deque限制缓存大小,防止内存溢出
|
||
- **无锁设计**: 避免线程锁导致的死锁问题
|
||
|
||
## 配置说明
|
||
|
||
在 `config.toml` 文件中可以配置缓存参数:
|
||
|
||
```toml
|
||
[XiurenImage]
|
||
enable = true
|
||
image_folder = '/mnt/nfs_share'
|
||
cache_size = 10 # 内存缓存大小,默认10张图片
|
||
command = ["图来", "秀人", "美图", "随机图片"]
|
||
```
|
||
|
||
### 配置参数
|
||
- `cache_size`: 缓存大小,建议设置为5-15张图片
|
||
- `image_folder`: 图片存储目录
|
||
- `enable`: 是否启用插件
|
||
- `command`: 触发命令列表
|
||
|
||
## 使用方法
|
||
|
||
### 1. 基本使用
|
||
用户发送以下命令即可获取随机图片:
|
||
- `图来`
|
||
- `秀人`
|
||
- `美图`
|
||
- `随机图片`
|
||
|
||
### 2. 缓存状态监控
|
||
插件会在日志中记录缓存状态:
|
||
```
|
||
从缓存获取图片成功,路径:/path/to/image.jpg,当前缓存数量:4
|
||
```
|
||
|
||
### 3. 测试缓存功能
|
||
运行测试脚本验证缓存功能:
|
||
```bash
|
||
cd plugins/xiuren_image
|
||
python test_cache.py
|
||
```
|
||
|
||
## 技术实现
|
||
|
||
### 1. 核心类
|
||
- `ImageCacheManager`: 缓存管理器
|
||
- `XiurenImagePlugin`: 主插件类
|
||
|
||
### 2. 关键方法
|
||
- `get_cached_image_bytes()`: 获取缓存的图片bytes
|
||
- `_refill_cache()`: 重新填充缓存
|
||
- `_load_image_bytes()`: 从磁盘加载图片bytes
|
||
|
||
### 3. 数据结构
|
||
```python
|
||
{
|
||
'path': str, # 图片文件路径
|
||
'bytes': bytes # 图片的bytes数据
|
||
}
|
||
```
|
||
|
||
### 4. 并发安全设计
|
||
- **无锁实现**: 使用Python的deque数据结构,其操作本身是线程安全的
|
||
- **原子操作**: deque的append和popleft操作是原子的
|
||
- **避免死锁**: 去掉了显式的线程锁,避免了死锁问题
|
||
- **异步填充**: 使用daemon线程进行异步填充,不会阻塞主流程
|
||
|
||
## 性能对比
|
||
|
||
### 优化前
|
||
- 每次请求都需要从磁盘读取图片文件
|
||
- 磁盘I/O成为性能瓶颈
|
||
- 响应时间较长
|
||
|
||
### 优化后
|
||
- 大部分请求直接从内存获取
|
||
- 显著减少磁盘I/O操作
|
||
- 响应时间大幅提升
|
||
- 无锁设计,避免并发问题
|
||
|
||
## 注意事项
|
||
|
||
1. **内存使用**: 缓存会占用一定内存,建议根据服务器内存情况调整缓存大小
|
||
2. **文件更新**: 如果图片文件被更新,需要重启插件或等待缓存刷新
|
||
3. **错误处理**: 如果缓存失败,会自动回退到原来的磁盘读取方式
|
||
4. **并发安全**: 使用deque的原子操作,支持并发访问,无需额外锁机制
|
||
|
||
## 故障排除
|
||
|
||
### 1. 缓存不工作
|
||
- 检查Redis连接是否正常
|
||
- 确认图片目录是否存在且有读取权限
|
||
- 查看日志中的错误信息
|
||
|
||
### 2. 内存占用过高
|
||
- 减少 `cache_size` 配置值
|
||
- 检查是否有内存泄漏
|
||
|
||
### 3. 图片获取失败
|
||
- 检查图片文件是否完整
|
||
- 确认文件格式是否支持
|
||
- 查看磁盘空间是否充足
|
||
|
||
### 4. 性能问题
|
||
- 如果出现卡死,检查是否有死锁问题
|
||
- 确保异步填充线程正常工作
|
||
- 监控缓存命中率
|
||
|
||
## 更新日志
|
||
|
||
### v1.1.0
|
||
- 去掉了线程锁,改用无锁设计
|
||
- 修复了死锁问题
|
||
- 提高了并发性能
|
||
- 增加了更详细的错误处理 |