gpt4 book ai didi

c# - 使用 C# 使用 Redis 缓存通用类型的对象

转载 作者:可可西里 更新时间:2023-11-01 11:12:55 26 4
gpt4 key购买 nike

我正在我的应用程序中创建一个新功能来使用 AOP 进行缓存。当使用 RedisCacheableResultAttribute 调用我的方法时,我将缓存/检索数据。我正在成功存储,不知道这是序列化和存储为字符串的正确方法,但是当我从 Redis 返回对象时,我需要转换为我第一次存储的类型。我想我可以通过反射(reflection)来做到这一点,但没有成功,我对反射(reflection)不是很有经验。

public sealed override void OnInvoke(MethodInterceptionArgs args)
{
var cache = RedisConnectorHelper.Connection.GetDatabase();
var result = cache.StringGet(args.Method.Name); // retrieving from Redis

if (result.HasValue)
{
args.ReturnValue = result; // here I need to convert back to the type I received when I stored.
return;
}

base.OnInvoke(args);
cache.StringSet(args.Method.Name, Serialize(args.ReturnValue)); //storing the data OK.
}

private string Serialize(object obj)
{
return JsonConvert.SerializeObject(obj);
}

最佳答案

这里不需要反射,只需使用JsonSerializerSettings将你的类型保存在数据 block 中:

private static readonly JsonSerializerSettings _settings = new JsonSerializerSettings { TypeHandling = TypeHandling.Object };

然后放入序列化和反序列化方法中:

private static string Serialize(object obj)
{
return JsonConvert.SerializeObject(obj, _settings);
}

private static object Deserialize(string data)
{
return JsonConvert.DeserializeObject(data, _settings);
}

然后在代码中:

public sealed override void OnInvoke(MethodInterceptionArgs args)
{
var cache = RedisConnectorHelper.Connection.GetDatabase();
var result = cache.StringGet(args.Method.Name); // retrieving from Redis

if (result.HasValue)
{
args.ReturnValue = Deserialize(result);
return;
}

base.OnInvoke(args);
cache.StringSet(args.Method.Name, Serialize(args.ReturnValue));
}

为了更快的解决方案,我建议您使用另一种称为 BSON(二进制 json)的 Newtonsoft 格式,它将您的对象转换为字节数组比转换为字符串快得多。所以只要不在乎可读性,使用它都是明智的。

我没有测试过,所以可能是编译错误,但是 Newtonsoft 有他们的方法来保存类型,所以你不应该为此烦恼。

关于c# - 使用 C# 使用 Redis 缓存通用类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47759081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com