|
@@ -2,7 +2,6 @@
|
|
|
#pragma warning disable CA5394
|
|
|
|
|
|
using System;
|
|
|
-using System.Collections.Concurrent;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Globalization;
|
|
|
using System.IO;
|
|
@@ -11,6 +10,7 @@ using System.Net;
|
|
|
using System.Net.Http;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
+using BitFaster.Caching.Lru;
|
|
|
using Emby.Naming.Common;
|
|
|
using Emby.Naming.TV;
|
|
|
using Emby.Server.Implementations.Library.Resolvers;
|
|
@@ -64,7 +64,6 @@ namespace Emby.Server.Implementations.Library
|
|
|
private const string ShortcutFileExtension = ".mblink";
|
|
|
|
|
|
private readonly ILogger<LibraryManager> _logger;
|
|
|
- private readonly ConcurrentDictionary<Guid, BaseItem> _cache;
|
|
|
private readonly ITaskManager _taskManager;
|
|
|
private readonly IUserManager _userManager;
|
|
|
private readonly IUserDataManager _userDataRepository;
|
|
@@ -81,6 +80,7 @@ namespace Emby.Server.Implementations.Library
|
|
|
private readonly IPeopleRepository _peopleRepository;
|
|
|
private readonly ExtraResolver _extraResolver;
|
|
|
private readonly IPathManager _pathManager;
|
|
|
+ private readonly FastConcurrentLru<Guid, BaseItem> _cache;
|
|
|
|
|
|
/// <summary>
|
|
|
/// The _root folder sync lock.
|
|
@@ -150,7 +150,9 @@ namespace Emby.Server.Implementations.Library
|
|
|
_mediaEncoder = mediaEncoder;
|
|
|
_itemRepository = itemRepository;
|
|
|
_imageProcessor = imageProcessor;
|
|
|
- _cache = new ConcurrentDictionary<Guid, BaseItem>();
|
|
|
+
|
|
|
+ _cache = new FastConcurrentLru<Guid, BaseItem>(_configurationManager.Configuration.CacheSize);
|
|
|
+
|
|
|
_namingOptions = namingOptions;
|
|
|
_peopleRepository = peopleRepository;
|
|
|
_pathManager = pathManager;
|
|
@@ -158,7 +160,7 @@ namespace Emby.Server.Implementations.Library
|
|
|
|
|
|
_configurationManager.ConfigurationUpdated += ConfigurationUpdated;
|
|
|
|
|
|
- RecordConfigurationValues(configurationManager.Configuration);
|
|
|
+ RecordConfigurationValues(_configurationManager.Configuration);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -306,7 +308,7 @@ namespace Emby.Server.Implementations.Library
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- _cache[item.Id] = item;
|
|
|
+ _cache.AddOrUpdate(item.Id, item);
|
|
|
}
|
|
|
|
|
|
public void DeleteItem(BaseItem item, DeleteOptions options)
|
|
@@ -460,14 +462,13 @@ namespace Emby.Server.Implementations.Library
|
|
|
item.SetParent(null);
|
|
|
|
|
|
_itemRepository.DeleteItem(item.Id);
|
|
|
+ _cache.TryRemove(item.Id, out _);
|
|
|
foreach (var child in children)
|
|
|
{
|
|
|
_itemRepository.DeleteItem(child.Id);
|
|
|
_cache.TryRemove(child.Id, out _);
|
|
|
}
|
|
|
|
|
|
- _cache.TryRemove(item.Id, out _);
|
|
|
-
|
|
|
ReportItemRemoved(item, parent);
|
|
|
}
|
|
|
|
|
@@ -1255,7 +1256,7 @@ namespace Emby.Server.Implementations.Library
|
|
|
throw new ArgumentException("Guid can't be empty", nameof(id));
|
|
|
}
|
|
|
|
|
|
- if (_cache.TryGetValue(id, out BaseItem? item))
|
|
|
+ if (_cache.TryGet(id, out var item))
|
|
|
{
|
|
|
return item;
|
|
|
}
|
|
@@ -1272,7 +1273,7 @@ namespace Emby.Server.Implementations.Library
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
public T? GetItemById<T>(Guid id)
|
|
|
- where T : BaseItem
|
|
|
+ where T : BaseItem
|
|
|
{
|
|
|
var item = GetItemById(id);
|
|
|
if (item is T typedItem)
|