그리드 표현 일부 완료. 데이터 검측 필수 예정

This commit is contained in:
Lectom C Han
2026-01-08 17:25:46 +09:00
parent 12262b4479
commit 2d84a26053
16 changed files with 891 additions and 191 deletions

View File

@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using StackExchange.Redis;
using ExcelKv.Core;
namespace SchemaEditor.Services;
public class GarnetClientService : IStorageWrapper, IDisposable
{
private ConnectionMultiplexer _redis;
private IDatabase _db;
public bool IsConnected => _redis != null && _redis.IsConnected;
public void Connect(string connectionString = "localhost:3187")
{
if (_redis == null || !_redis.IsConnected)
{
_redis = ConnectionMultiplexer.Connect(connectionString);
_db = _redis.GetDatabase();
}
}
public async Task SetAsync(string key, string value)
{
if (_db == null) Connect();
await _db.StringSetAsync(key, value);
}
public async Task SetAsync(string key, string value, int row, int col)
{
// For Garnet, we currently only store Key-Value string.
// Traceability metadata (row, col) could be stored in a hash or side key if needed.
// For now, we just proceed with standard storage.
if (_db == null) Connect();
await _db.StringSetAsync(key, value);
}
public async Task IncrementAsync(string key, double value)
{
if (_db == null) Connect();
await _db.StringIncrementAsync(key, value);
}
// For Data Explorer
public async Task<List<string>> SearchKeysAsync(string pattern)
{
if (_db == null) Connect();
var server = _redis.GetServer(_redis.GetEndPoints().First());
// Use Keys for simplicity in Schema Editor (low traffic)
// In high production, use SCAN
var keys = server.Keys(pattern: pattern).Select(k => k.ToString()).ToList();
return await Task.FromResult(keys);
}
public async Task<string> GetValueAsync(string key)
{
if (_db == null) Connect();
return await _db.StringGetAsync(key);
}
public void Dispose()
{
_redis?.Dispose();
}
}