Merge pull request #840 from yileicn/RedisCacheOptimize

optimize RedisCache
This commit is contained in:
Haiping 2025-01-22 20:44:18 -06:00 committed by GitHub
commit 7bb6e7ccb8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 12 additions and 26 deletions

View file

@ -51,21 +51,11 @@ public static class BotSharpCoreExtensions
var cacheSettings = new SharpCacheSettings(); var cacheSettings = new SharpCacheSettings();
config.Bind("SharpCache", cacheSettings); config.Bind("SharpCache", cacheSettings);
services.AddSingleton(x => cacheSettings); services.AddSingleton(x => cacheSettings);
services.AddSingleton<MemoryCacheService>();
if (cacheSettings.CacheType == CacheType.RedisCache) services.AddSingleton<ICacheService>(sp => cacheSettings.CacheType switch
{ {
services.AddSingleton<RedisCacheService>(); CacheType.RedisCache => ActivatorUtilities.CreateInstance<RedisCacheService>(sp),
} _ => ActivatorUtilities.CreateInstance<MemoryCacheService>(sp),
services.AddSingleton<RedisCacheService>();
services.AddSingleton<ICacheService>(sp =>
{
return cacheSettings.CacheType switch
{
CacheType.RedisCache => sp.GetRequiredService<RedisCacheService>(),
_ => sp.GetRequiredService<MemoryCacheService>(),
};
}); });
} }

View file

@ -6,16 +6,16 @@ namespace BotSharp.Core.Infrastructures;
public class RedisCacheService : ICacheService public class RedisCacheService : ICacheService
{ {
private readonly IServiceProvider _services; private readonly IConnectionMultiplexer _redis;
public RedisCacheService() public RedisCacheService(IConnectionMultiplexer redis)
{ {
_redis = redis;
} }
public async Task<T?> GetAsync<T>(string key) public async Task<T?> GetAsync<T>(string key)
{ {
var redis = _services.GetService<IConnectionMultiplexer>(); var db = _redis.GetDatabase();
var db = redis.GetDatabase();
var value = await db.StringGetAsync(key); var value = await db.StringGetAsync(key);
if (value.HasValue) if (value.HasValue)
@ -28,8 +28,7 @@ public class RedisCacheService : ICacheService
public async Task<object> GetAsync(string key, Type type) public async Task<object> GetAsync(string key, Type type)
{ {
var redis = _services.GetService<IConnectionMultiplexer>(); var db = _redis.GetDatabase();
var db = redis.GetDatabase();
var value = await db.StringGetAsync(key); var value = await db.StringGetAsync(key);
if (value.HasValue) if (value.HasValue)
@ -43,23 +42,20 @@ public class RedisCacheService : ICacheService
public async Task SetAsync<T>(string key, T value, TimeSpan? expiry) public async Task SetAsync<T>(string key, T value, TimeSpan? expiry)
{ {
var redis = _services.GetService<IConnectionMultiplexer>(); var db = _redis.GetDatabase();
var db = redis.GetDatabase();
await db.StringSetAsync(key, JsonConvert.SerializeObject(value), expiry); await db.StringSetAsync(key, JsonConvert.SerializeObject(value), expiry);
} }
public async Task RemoveAsync(string key) public async Task RemoveAsync(string key)
{ {
var redis = _services.GetService<IConnectionMultiplexer>(); var db = _redis.GetDatabase();
var db = redis.GetDatabase();
await db.KeyDeleteAsync(key); await db.KeyDeleteAsync(key);
} }
public async Task ClearCacheAsync(string prefix) public async Task ClearCacheAsync(string prefix)
{ {
var redis = _services.GetService<IConnectionMultiplexer>(); var db = _redis.GetDatabase();
var db = redis.GetDatabase(); var server = _redis.GetServer(_redis.GetEndPoints().First());
var server = redis.GetServer(redis.GetEndPoints().First());
const int pageSize = 1000; const int pageSize = 1000;
var keys = server.Keys(pattern: $"{prefix}*", pageSize: pageSize).ToList(); var keys = server.Keys(pattern: $"{prefix}*", pageSize: pageSize).ToList();