Browse Source

Avoid caching empty version information.

pull/23683/head
maliming 1 year ago
parent
commit
c733147e9e
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 38
      modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/Projects/ProjectAppService.cs

38
modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/Projects/ProjectAppService.cs

@ -1,11 +1,13 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Distributed;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Caching; using Volo.Abp.Caching;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Threading;
using Volo.Docs.Caching; using Volo.Docs.Caching;
using Volo.Docs.Documents; using Volo.Docs.Documents;
using Volo.Docs.Projects; using Volo.Docs.Projects;
@ -19,6 +21,8 @@ namespace Volo.Docs.Common.Projects
private readonly IDocumentSourceFactory _documentSource; private readonly IDocumentSourceFactory _documentSource;
protected IDistributedCache<LanguageConfig> LanguageCache { get; } protected IDistributedCache<LanguageConfig> LanguageCache { get; }
private readonly SemaphoreSlim _syncSemaphore = new SemaphoreSlim(1, 1);
public ProjectAppService( public ProjectAppService(
IProjectRepository projectRepository, IProjectRepository projectRepository,
IDistributedCache<List<VersionInfo>> versionCache, IDistributedCache<List<VersionInfo>> versionCache,
@ -56,21 +60,31 @@ namespace Volo.Docs.Common.Projects
public virtual async Task<ListResultDto<VersionInfoDto>> GetVersionsAsync(string shortName) public virtual async Task<ListResultDto<VersionInfoDto>> GetVersionsAsync(string shortName)
{ {
var project = await _projectRepository.GetByShortNameAsync(shortName); var project = await _projectRepository.GetByShortNameAsync(shortName);
using (await _syncSemaphore.LockAsync())
var versions = await _versionCache.GetOrAddAsync( {
CacheKeyGenerator.GenerateProjectVersionsCacheKey(project), var versions = await _versionCache.GetAsync(CacheKeyGenerator.GenerateProjectVersionsCacheKey(project));
() => GetVersionsAsync(project), if (versions.IsNullOrEmpty())
() => new DistributedCacheEntryOptions
{ {
//TODO: Configurable? versions = await GetVersionsAsync(project);
AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(12), if (!versions.IsNullOrEmpty())
SlidingExpiration = TimeSpan.FromMinutes(60) {
await _versionCache.SetAsync(
CacheKeyGenerator.GenerateProjectVersionsCacheKey(project),
versions,
new DistributedCacheEntryOptions
{
//TODO: Configurable?
AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(12),
SlidingExpiration = TimeSpan.FromMinutes(60)
}
);
}
} }
);
return new ListResultDto<VersionInfoDto>( return new ListResultDto<VersionInfoDto>(
ObjectMapper.Map<List<VersionInfo>, List<VersionInfoDto>>(versions) ObjectMapper.Map<List<VersionInfo>, List<VersionInfoDto>>(versions)
); );
}
} }
protected virtual async Task<List<VersionInfo>> GetVersionsAsync(Project project) protected virtual async Task<List<VersionInfo>> GetVersionsAsync(Project project)

Loading…
Cancel
Save