Skip to content

Commit

Permalink
cache prefix root
Browse files Browse the repository at this point in the history
  • Loading branch information
azhe403 committed Oct 19, 2024
1 parent db7e512 commit d556bbe
Show file tree
Hide file tree
Showing 10 changed files with 80 additions and 55 deletions.
44 changes: 25 additions & 19 deletions backend/ZiziBot.Caching/Extensions/CacheTowerExtension.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System.Text.Json;
using CacheTower.Providers.Database.MongoDB;
using CacheTower;
using CacheTower.Providers.FileSystem;
using CacheTower.Providers.Redis;
using CacheTower.Serializers.SystemTextJson;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
Expand All @@ -12,6 +11,10 @@ namespace ZiziBot.Caching.Extensions;

public static class CacheTowerExtension
{
static ICacheSerializer CurrentSerializer => new SystemTextJsonCacheSerializer(new JsonSerializerOptions() {
WriteIndented = true
});

public static IServiceCollection AddCacheTower(this IServiceCollection services)
{
var serviceProvider = services.BuildServiceProvider();
Expand Down Expand Up @@ -41,12 +44,11 @@ private static ICacheStackBuilder ConfigureRedisCacheLayer(this ICacheStackBuild
if (string.IsNullOrEmpty(cacheConfig.RedisConnection))
return builder;

builder.CacheLayers.Add(new CacheTowerRedisProvider(
builder.CacheLayers.Add(new RedisLayerProvider(
connectionString: cacheConfig.RedisConnection,
options: new RedisCacheLayerOptions(
new SystemTextJsonCacheSerializer(new JsonSerializerOptions() {
WriteIndented = true
})
options: new RedisLayerOptions(
Serializer: CurrentSerializer,
PrefixRoot: cacheConfig.PrefixRoot
)
));

Expand All @@ -61,17 +63,17 @@ private static ICacheStackBuilder ConfigureFileCacheLayer(this ICacheStackBuilde
builder.AddFileCacheLayer(
new FileCacheLayerOptions(
DirectoryPath: PathConst.CACHE_TOWER_PATH.EnsureDirectory(),
Serializer: new SystemTextJsonCacheSerializer(new JsonSerializerOptions() {
WriteIndented = true
})
Serializer: CurrentSerializer
)
);

return builder;
}

private static ICacheStackBuilder ConfigureFirebaseCacheLayer(this ICacheStackBuilder builder,
CacheConfig cacheConfig)
private static ICacheStackBuilder ConfigureFirebaseCacheLayer(
this ICacheStackBuilder builder,
CacheConfig cacheConfig
)
{
if (!cacheConfig.UseFirebase)
return builder;
Expand All @@ -81,33 +83,37 @@ private static ICacheStackBuilder ConfigureFirebaseCacheLayer(this ICacheStackBu
ServiceAccountJson = cacheConfig.FirebaseServiceAccountJson
};

builder.CacheLayers.Add(new CacheTowerFirebaseProvider(firebaseOptions));
builder.CacheLayers.Add(new FirebaseLayerProvider(firebaseOptions));

return builder;
}

private static ICacheStackBuilder ConfigureSqliteCacheLayer(this ICacheStackBuilder builder,
CacheConfig cacheConfig)
private static ICacheStackBuilder ConfigureSqliteCacheLayer(
this ICacheStackBuilder builder,
CacheConfig cacheConfig
)
{
if (!cacheConfig.UseSqlite)
return builder;

var dbPath = PathConst.CACHE_TOWER_SQLITE_PATH.EnsureDirectory();

builder.CacheLayers.Add(new CacheTowerSqliteProvider(dbPath));
builder.CacheLayers.Add(new SqliteLayerProvider(dbPath));

return builder;
}

private static ICacheStackBuilder ConfigureMongoDbCacheLayer(this ICacheStackBuilder builder,
CacheConfig cacheConfig)
private static ICacheStackBuilder ConfigureMongoDbCacheLayer(
this ICacheStackBuilder builder,
CacheConfig cacheConfig
)
{
if (!cacheConfig.UseMongoDb)
return builder;

var dbPath = EnvUtil.GetEnv(Env.MONGODB_CONNECTION_STRING);

builder.CacheLayers.Add(new MongoDbCacheLayer(MongoDbConnection.FromConnectionString(dbPath)));
builder.AddMongoDbCacheLayer(MongoDbConnection.FromConnectionString(dbPath));

return builder;
}
Expand Down
2 changes: 1 addition & 1 deletion backend/ZiziBot.Caching/Firebase/FirebaseCacheEntry.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace ZiziBot.Caching.Firebase;

public class FirebaseCacheEntry<T>
internal class FirebaseCacheEntry<T>
{
public string CacheKey { get; set; }
public T? Value { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace ZiziBot.Caching.Firebase;

public class CacheTowerFirebaseProvider(FirebaseCacheOptions cacheOptions) : ICacheLayer
internal class FirebaseLayerProvider(FirebaseCacheOptions cacheOptions) : ICacheLayer
{
public ValueTask FlushAsync()
{
Expand All @@ -23,7 +23,6 @@ public ValueTask CleanupAsync()
.DeleteAsync();

return ValueTask.CompletedTask;

}

public async ValueTask EvictAsync(string cacheKey)
Expand Down Expand Up @@ -57,8 +56,7 @@ await GetClient()
.Child(cacheOptions.RootDir)
.Child(cacheKey)
.PutAsync(
new FirebaseCacheEntry<T?>()
{
new FirebaseCacheEntry<T?>() {
CacheKey = cacheKey,
Value = cacheEntry.Value,
Expiry = cacheEntry.Expiry
Expand All @@ -80,8 +78,7 @@ private FirebaseClient GetClient()
{
var client = new FirebaseClient(
baseUrl: cacheOptions.ProjectUrl,
options: new FirebaseOptions
{
options: new FirebaseOptions {
AuthTokenAsyncFactory = GetAccessToken,
AsAccessToken = true
}
Expand Down
2 changes: 1 addition & 1 deletion backend/ZiziBot.Caching/Firebase/FirebaseUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace ZiziBot.Caching.Firebase;

public static class FirebaseUtil
internal static class FirebaseUtil
{
public static ChildQuery ChildTree(this ChildQuery childQuery, string key)
{
Expand Down
9 changes: 9 additions & 0 deletions backend/ZiziBot.Caching/Redis/RedisLayerOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using CacheTower;

namespace ZiziBot.Caching.Redis;

internal record struct RedisLayerOptions(
ICacheSerializer Serializer,
int DatabaseIndex = -1,
string PrefixRoot = ""
);
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
using CacheTower;
using CacheTower.Providers.Redis;
using StackExchange.Redis;

namespace ZiziBot.Caching.Redis;

public class CacheTowerRedisProvider(
internal class RedisLayerProvider(
string connectionString,
RedisCacheLayerOptions options
RedisLayerOptions options
)
: IDistributedCacheLayer
{
Expand All @@ -24,7 +23,7 @@ public async ValueTask EvictAsync(string cacheKey)
{
await Connect();

await Database.KeyDeleteAsync(cacheKey);
await Database.KeyDeleteAsync(CacheKey(cacheKey));
}

public async ValueTask FlushAsync()
Expand All @@ -34,15 +33,20 @@ public async ValueTask FlushAsync()
var redisEndpoints = Connection.GetEndPoints();
foreach (var endpoint in redisEndpoints)
{
await Connection.GetServer(endpoint).FlushDatabaseAsync(options.DatabaseIndex);
var keys = Connection.GetServer(endpoint).KeysAsync(options.DatabaseIndex, pattern: $"{options.PrefixRoot}*");

await foreach (var redisKey in keys)
{
await Database.KeyDeleteAsync(redisKey);
}
}
}

public async ValueTask<CacheEntry<T>?> GetAsync<T>(string cacheKey)
{
await Connect();

var redisValue = await Database.StringGetAsync(cacheKey);
var redisValue = await Database.StringGetAsync(CacheKey(cacheKey));
if (redisValue != RedisValue.Null)
{
using var stream = new MemoryStream(redisValue);
Expand Down Expand Up @@ -73,12 +77,17 @@ public async ValueTask SetAsync<T>(string cacheKey, CacheEntry<T> cacheEntry)
options.Serializer.Serialize(stream, cacheEntry);
stream.Seek(0, SeekOrigin.Begin);
var redisValue = RedisValue.CreateFrom(stream);
await Database.StringSetAsync(cacheKey, redisValue, expiryOffset);
await Database.StringSetAsync(CacheKey(cacheKey), redisValue, expiryOffset);
}

async Task Connect()
{
Connection = await ConnectionMultiplexer.ConnectAsync(ConnectionString);
Database = Connection.GetDatabase(options.DatabaseIndex);
}

string CacheKey(string cacheKey)
{
return options.PrefixRoot.IsNullOrEmpty() ? $"{cacheKey}".Replace("/", ":") : $"{options.PrefixRoot}/{cacheKey}".Replace("/", ":");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@

namespace ZiziBot.Caching.Sqlite;

public class CacheTowerSqliteProvider : ICacheLayer
internal class SqliteLayerProvider : ICacheLayer
{
private readonly string _dbPath;

public CacheTowerSqliteProvider(string dbPath)
public SqliteLayerProvider(string dbPath)
{
_dbPath = dbPath;

Expand Down
40 changes: 21 additions & 19 deletions backend/ZiziBot.Caching/ZiziBot.Caching.csproj
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="CacheTower" Version="0.14.0"/>
<PackageReference Include="CacheTower.Providers.Database.MongoDB" Version="0.14.0"/>
<PackageReference Include="CacheTower.Providers.Redis" Version="0.14.0"/>
<PackageReference Include="CacheTower.Serializers.SystemTextJson" Version="0.14.0"/>
<PackageReference Include="FirebaseDatabase.net" Version="4.2.0"/>
<PackageReference Include="Google.Apis.Auth" Version="1.68.0"/>
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.1"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="CacheTower" Version="0.14.0"/>
<PackageReference Include="CacheTower.Providers.Database.MongoDB" Version="0.14.0"/>
<PackageReference Include="CacheTower.Providers.FileSystem.Json" Version="0.14.0"/>
<PackageReference Include="CacheTower.Providers.Redis" Version="0.14.0"/>
<PackageReference Include="CacheTower.Serializers.NewtonsoftJson" Version="0.14.0"/>
<PackageReference Include="CacheTower.Serializers.SystemTextJson" Version="0.14.0"/>
<PackageReference Include="FirebaseDatabase.net" Version="4.2.0"/>
<PackageReference Include="Google.Apis.Auth" Version="1.68.0"/>
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.1"/>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\ZiziBot.Contracts\ZiziBot.Contracts.csproj"/>
<ProjectReference Include="..\ZiziBot.DataSource\ZiziBot.DataSource.csproj"/>
<ProjectReference Include="..\ZiziBot.Utils\ZiziBot.Utils.csproj"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ZiziBot.Contracts\ZiziBot.Contracts.csproj"/>
<ProjectReference Include="..\ZiziBot.DataSource\ZiziBot.DataSource.csproj"/>
<ProjectReference Include="..\ZiziBot.Utils\ZiziBot.Utils.csproj"/>
</ItemGroup>

</Project>
1 change: 1 addition & 0 deletions backend/ZiziBot.Contracts/Configs/CacheConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public class CacheConfig
public bool UseJsonFile { get; set; }
public bool UseMongoDb { get; set; }
public bool UseSqlite { get; set; }
public string PrefixRoot { get; set; }
public string? RedisConnection { get; set; }
public string? FirebaseProjectUrl { get; set; }
public string? FirebaseServiceAccountJson { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ private void SeedAppSettings()
{ "UseMongoDb", false },
{ "UseRedis", false },
{ "UseSqlite", false },
{ "PrefixRoot", "zizi_dev" },
{ "RedisConnection", "localhost:6379" }
}
},
Expand Down

0 comments on commit d556bbe

Please sign in to comment.