繁体   English   中英

如何在不进行序列化的情况下Redis缓存大型C#对象?

[英]How to Redis cache Large C# object without serializing?

在我的应用程序中,我们使用C#字典在内存中缓存大型Business对象。

为了将Redis缓存进行JSON序列化/反序列化,我正在将巨大的多轮引用的C#对象(JSON序列化时约为300KB)转换为DTO。

似乎由于参数化构造函数,我的业务层中的某些类型无法轻松初始化。

有没有一种方法可以在不进行序列化的情况下实现Redis缓存? 这样可以退还我缓存的相同对象吗?

有没有一种方法可以在不进行序列化的情况下实现Redis缓存?

简短的回答:

稍长一点的答案:不,因为Redis基于字符串。 在这些字符串中,您可以存储各种各样的东西,但最终所有这些都归结为字符串。 因此,当您要将某些内容存储在Redis中时,就无法脱离序列化。

Redis不是简单的键值存储,它实际上是一个数据结构服务器,支持各种类型的值。 这意味着,尽管在传统的键值存储中,您将字符串键关联到字符串值,但是在Redis中,该值不仅限于简单的字符串,还可以容纳更复杂的数据结构。 以下是Redis支持的所有数据结构的列表,本教程将分别进行介绍:

  • 二进制安全字符串。
  • 列表:根据插入顺序排序的字符串元素的集合。 它们基本上是链表。
  • 集:唯一,未排序的字符串元素的集合。
  • 排序集合,类似于集合,但每个字符串元素都与一个称为得分的浮点值相关联。 元素总是按它们的分数排序,因此与Sets不同,可以检索一系列元素(例如,您可能会问:给我前10名或后10名)。
  • 哈希,是由与值关联的字段组成的映射。 字段和值都是字符串。 这与Ruby或Python哈希非常相似。
  • 位数组(或简称为位图):可以使用特殊命令像位数组一样处理字符串值:您可以设置和清除单个位,计数所有设置为1的位,找到第一个设置或未设置的位,等等。
  • HyperLogLogs:这是一个概率数据结构,用于估计集合的基数。 别害怕,它比看起来更简单...请参阅本教程后面的HyperLogLog部分。

详细信息: Redis数据类型和抽象简介

好的。 我知道我问了这个问题已经很长时间了。 但是我们解决了这个问题。 我们使用BinaryFormatter序列化程序,该序列化程序实际上将.NET对象转换为内存映射,并将其序列化为二进制数组。 该内存映射可用于在没有公共默认构造函数的情况下重新创建原始对象。 早期版本的.NET支持此BinaryFormatter序列化。

这种方法的缺点是我们必须手动进入对象层次结构中的每个类,并为该类提供Serializable Attribute装饰。 另一个缺点是,只有包含非null值的属性才被序列化。 这意味着,如果您的任何单元测试都没有初始化要序列化的对象的某些或任何属性,那么我们很有可能会遇到运行时Serialization Exception,可以通过装饰类型Serializable轻松解决该异常。

我们也可以使用其他序列化格式,例如MsgPack等。

public class TheTypeToBeCached
{
   public OneSubType Property1 {get;set;}
   public SecondSubType Property2 {get;set;}
}

public class OneSubType 
{
    public ThirdSubType Property3 {get;set;}
    public ForthSubType Property4 {get;set;}
    public AnotherSubType Property5 {get;set;}
}
public class SecondSubType
{
    public ForthSubType Property6 {get;set;}
    public AnotherSubType Property7 {get;set;}
}
public class ThridSubType
{
    public SecondSubType Property8{get;set;}
}
public class ForthSubType
{
    public SecondSubType Property9{get;set;}
}
public class AnotherSubType
{
    public OneSubType Property10{get;set;}
}

即使具有多个回合关系,也可以使用BinaryFormatter序列化程序对上述层次结构进行序列化和反序列化。

[Serializable]
public class TheTypeToBeCached
{
   public OneSubType Property1 {get;set;}
   public SecondSubType Property2 {get;set;}
}

[Serializable]
public class OneSubType 
{
    public ThirdSubType Property3 {get;set;}
    public ForthSubType Property4 {get;set;}
    public AnotherSubType Property5 {get;set;}
}

[Serializable]
public class SecondSubType
{
    public ForthSubType Property6 {get;set;}
    public AnotherSubType Property7 {get;set;}
}

[Serializable]
public class ThridSubType
{
    public SecondSubType Property8{get;set;}
}

[Serializable]
public class ForthSubType
{
    public SecondSubType Property9{get;set;}
}

[Serializable]
public class AnotherSubType
{
    public OneSubType Property10{get;set;}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM