1
0
mirror of https://git.teknik.io/Teknikode/Teknik.git synced 2023-08-02 14:16:22 +02:00
Teknik/Utilities/ObjectCache.cs
2022-05-23 23:45:40 -07:00

64 lines
1.9 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Teknik.Utilities
{
public class ObjectCache
{
private readonly static ConcurrentDictionary<string, Tuple<DateTime, object>> objectCache = new ConcurrentDictionary<string, Tuple<DateTime, object>>();
private readonly int _cacheSeconds;
public ObjectCache(int cacheSeconds)
{
_cacheSeconds = cacheSeconds;
}
public T GetObject<T>(string key, Func<string, T> getObjectFunc)
{
T foundObject;
var cacheDate = DateTime.UtcNow;
if (objectCache.TryGetValue(key, out var result) &&
result.Item1 > cacheDate.Subtract(new TimeSpan(0, 0, _cacheSeconds)))
{
return (T)result.Item2;
}
else
{
foundObject = getObjectFunc(key);
// Update the cache for this key
if (foundObject != null)
UpdateObject(key, foundObject, cacheDate);
}
return foundObject;
}
public void UpdateObject<T>(string key, T update)
{
UpdateObject(key, update, DateTime.UtcNow);
}
public void UpdateObject<T>(string key, T update, DateTime cacheTime)
{
objectCache[key] = new Tuple<DateTime, object>(cacheTime, update);
}
public void DeleteObject(string key)
{
objectCache.TryRemove(key, out _);
}
public bool CacheValid(string key)
{
if (objectCache.TryGetValue(key, out var result) &&
result.Item1 > DateTime.UtcNow.Subtract(new TimeSpan(0, 0, _cacheSeconds)))
return true;
return false;
}
}
}