using System.Threading;
using Dpz.Core.Public.ViewModel.RequestEvent;
namespace Dpz.Core.Service.Event;
public class AddDanmakuCountEvent(
IRepository<Video> repository,
IBarrageService barrageService,
IFusionCache fusionCache
) : IRequestHandler<AddDanmakuCountRequest>
{
public async Task Handle(AddDanmakuCountRequest request, CancellationToken cancellationToken)
{
var count = await barrageService.GetGroupBarrageCountAsync(request.DanmakuGroup);
var update = Builders<Video>.Update.Set(x => x.DanmakuCount, count);
await repository.UpdateAsync(x => x.Id == request.DanmakuGroup, update, cancellationToken);
var key = $"{CacheKey.VideoListKey}:{request.DanmakuGroup}";
var cacheValue = await fusionCache.TryGetAsync<VmVideo>(key, token: cancellationToken);
if (cacheValue.HasValue)
{
cacheValue.Value.DanmakuCount = count;
await fusionCache.SetAsync(
key,
cacheValue.Value,
TimeSpan.FromDays(1),
[CacheKey.VideoListKey],
token: cancellationToken
);
}
var listCache = await fusionCache.TryGetAsync<List<VmVideo>>(
CacheKey.VideoListKey,
token: cancellationToken
);
if (listCache.HasValue)
{
var video = listCache.Value.FirstOrDefault(x => x.Id == request.DanmakuGroup);
if (video != null)
{
video.DanmakuCount = count;
await fusionCache.SetAsync(
CacheKey.VideoListKey,
listCache.Value,
TimeSpan.FromDays(1),
[CacheKey.VideoListKey],
token: cancellationToken
);
}
}
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
代码功能解释
这段代码是一个事件处理器 AddDanmakuCountEvent,用于处理增加弹幕数量的请求。以下是它的主要功能:
主要功能
更新视频弹幕数量:
- 通过
barrageService.GetGroupBarrageCountAsync获取指定弹幕组的弹幕总数 - 使用
repository.UpdateAsync更新数据库中对应视频的弹幕数量
- 通过
缓存更新:
单个视频缓存更新:
- 检查是否存在该视频的缓存(
CacheKey.VideoListKey:{DanmakuGroup}) - 如果存在,更新缓存中的弹幕数量并重新设置缓存(有效期1天)
- 检查是否存在该视频的缓存(
视频列表缓存更新:
- 检查是否存在视频列表的缓存(
CacheKey.VideoListKey) - 如果存在,找到对应的视频并更新其弹幕数量,然后重新设置整个列表的缓存(有效期1天)
- 检查是否存在视频列表的缓存(
依赖项
IRepository<Video>:用于数据库操作IBarrageService:用于获取弹幕数量IFusionCache:用于缓存管理
处理流程
- 接收
AddDanmakuCountRequest请求 - 从弹幕服务获取当前弹幕总数
- 更新数据库中的弹幕数量
- 更新相关缓存(单个视频和视频列表)
这个处理器确保了当弹幕数量变化时,数据库和缓存中的数据都能保持同步。
评论加载中...