使用C#

时间:2017-12-11 18:27:17

标签: c# caching redis

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

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);
}

2 个答案:

答案 0 :(得分:2)

此处无需反思,只需使用 JsonSerializerSettings 将您的类型保存在数据blob中:

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有他们保存类型的方法,所以你不应该为此烦恼。

答案 1 :(得分:0)

修复了以下解决方案的问题:

在我使用Apsect的输入法中,我将类型更改为动态。使用对象也可以。

[RedisCacheableResult]
public List<dynamic> ReturnCustomer()
{
    var lstCustomer = new List<dynamic>();

    var customer = new Customer
    {
        Id = 1,
        Name = "Acme Inc",
        Email = "acme@email.com"
    };

    var customer1 = new Customer
    {
        Id = 2,
        Name = "Marvel Inc",
        Email = "Marvel@email.com"
    };

    lstCustomer.Add(customer);
    lstCustomer.Add(customer1);

    return lstCustomer;
}

反序列化:

private static dynamic Deserialize(string data)
{
    return JsonConvert.DeserializeObject<List<dynamic>>(data, Settings);
}

segueasoluçãopublicadano GitHub https://github.com/thiagoloureiro/TestaCache

欢迎提出问题,请求,明星和叉子。)