using HoneyBox.Core.Interfaces;
using Microsoft.Extensions.Logging;
namespace HoneyBox.Core.Services;
///
/// 商品缓存服务实现
///
public class GoodsCacheService : IGoodsCacheService
{
private readonly IRedisService _redisService;
private readonly ILogger _logger;
// 缓存键前缀 - 与PHP保持一致
private const string JoinCountKeyPrefix = "order_goods_count:";
private const string GoodsListKeyPrefix = "goods_list_";
private const string GoodsDetailKeyPrefix = "goods_detail_";
// 缓存过期时间
private static readonly TimeSpan JoinCountExpiry = TimeSpan.FromMinutes(5);
private static readonly TimeSpan GoodsListExpiry = TimeSpan.FromSeconds(30);
private static readonly TimeSpan GoodsDetailExpiry = TimeSpan.FromMinutes(5);
public GoodsCacheService(
IRedisService redisService,
ILogger logger)
{
_redisService = redisService;
_logger = logger;
}
///
public async Task GetJoinCountAsync(int goodsId)
{
var key = $"{JoinCountKeyPrefix}{goodsId}";
var value = await _redisService.GetStringAsync(key);
if (int.TryParse(value, out var count))
{
return count;
}
// 返回-1表示缓存不存在
return -1;
}
///
public async Task SetJoinCountAsync(int goodsId, int count)
{
var key = $"{JoinCountKeyPrefix}{goodsId}";
await _redisService.SetStringAsync(key, count.ToString(), JoinCountExpiry);
}
///
public async Task IncrementJoinCountAsync(int goodsId)
{
var key = $"{JoinCountKeyPrefix}{goodsId}";
var currentValue = await GetJoinCountAsync(goodsId);
var newValue = currentValue > 0 ? currentValue + 1 : 1;
await _redisService.SetStringAsync(key, newValue.ToString(), JoinCountExpiry);
return newValue;
}
///
public async Task InvalidateGoodsCacheAsync(int goodsId)
{
// 清除参与次数缓存
var joinCountKey = $"{JoinCountKeyPrefix}{goodsId}";
await _redisService.DeleteAsync(joinCountKey);
// 清除商品详情缓存 - 由于箱号可能有多个,这里清除所有可能的箱号缓存
// 注意:实际生产环境中可能需要使用Redis的SCAN命令来批量删除
// 这里简化处理,只清除常见的箱号范围(0-100)
var deleteTasks = new List();
for (int num = 0; num <= 100; num++)
{
var detailKey = $"{GoodsDetailKeyPrefix}{goodsId}_{num}";
deleteTasks.Add(_redisService.DeleteAsync(detailKey));
}
await Task.WhenAll(deleteTasks);
_logger.LogInformation("已清除商品 {GoodsId} 的所有缓存(参与次数、商品详情)", goodsId);
}
///
public async Task GetGoodsListCacheAsync(string cacheKey)
{
var key = $"{GoodsListKeyPrefix}{cacheKey}";
return await _redisService.GetStringAsync(key);
}
///
public async Task SetGoodsListCacheAsync(string cacheKey, string data, TimeSpan expiry)
{
var key = $"{GoodsListKeyPrefix}{cacheKey}";
await _redisService.SetStringAsync(key, data, expiry);
}
///
public async Task GetGoodsDetailCacheAsync(int goodsId, int goodsNum)
{
var key = $"{GoodsDetailKeyPrefix}{goodsId}_{goodsNum}";
return await _redisService.GetStringAsync(key);
}
///
public async Task SetGoodsDetailCacheAsync(int goodsId, int goodsNum, string data, TimeSpan expiry)
{
var key = $"{GoodsDetailKeyPrefix}{goodsId}_{goodsNum}";
await _redisService.SetStringAsync(key, data, expiry);
}
}