【问题标题】:Keep an object as a value in Redis using its HashTable使用其 HashTable 将对象作为值保留在 Redis 中
【发布时间】:2019-12-06 17:29:32
【问题描述】:

我是 Redis 新手,我正在尝试编写一个简单的项目,该项目从 SQL 数据库中收集信息并缓存到 Redis 中。由于我对 C# 更加熟悉,因此我选择了 StackExchange.Redis 来执行此操作。

假设我的数据库中有一个表,其架构类似于 Persons(ID, Name, Address, Age, BirthDate)。 我的项目中有一个具有相应字段的 Person 类。 我还有一个函数 GetPersonByID(ID),它请求 Redis,如果 ID 为 的键不存在,它会执行另一个名为 GetPersonByID_SQL(ID ),当执行 sql 查询时,从 db 获取信息后,它会创建一个对象 Person,将该对象添加到 Redis(使用 hashTable)并返回该对象。如果键存在于 Redis 中,该函数只是从 Redis 获取信息,创建一个对象 Person,将相应的值映射到字段并返回该对象。

这是我如何做到这一点的代码。

public static Person GetPersonByID(string ID)
        {
            redis = ConnectionMultiplexer.Connect("127.0.0.1");
            IDatabase db = redis.GetDatabase();
            Person p;

            if (!db.KeyExists(key))
            {
                p = Person.GetPersonByID_SQL(ID);
                db.HashSet(key, "Name", p.Name);
                db.HashSet(key, "Address", p.Address);
                db.HashSet(key, "Age", p.Age);
                db.HashSet(key, "BirthDate", p.BirthDate); 
            }
            else
            {
                HashEntry[] values = db.HashGetAll(key);
                p = new Person();

                for (int i = 0; i < values.Length; i++)
                {
                    HashEntry hashEntry = values[i];
                    switch (hashEntry.Name)
                    {
                        case "Name": p.Name = hashEntry.Value; break;
                        case "Address": p.Address = hashEntry.Value; break;
                        case "Age": p.Age = hashEntry.Value; break;
                        case "BirthDate": p.BirthDate = hashEntry.Value; break;
                    }
                }
            }

            return p;
        } 

我的问题是,有什么方法可以将 Redis 的值(以我的方式是 HashTable)自动绑定到我现有的对象?

【问题讨论】:

    标签: caching redis binding stackexchange.redis


    【解决方案1】:

    我的问题是,有什么方法可以将 Redis 的值(以我的方式是 HashTable)自动绑定到我现有的对象?

    不,这不是 StackExchange.Redis 的功能 - 值只能存储为最基本的类型(字符串和数字)。您需要自己转换成更复杂的值。

    因此,您可以将您的人员对象存储为多个哈希字段(就像您在代码中所做的那样),或者您可以将您的人员对象存储为针对一个键的单个序列化字符串(您可以使用 STRING 数据结构这个代替)。然后,您可以在要检索值时执行必要的反序列化。

    如果您总是想从您的 Person 数据结构中检索每个值,我建议您选择第二个选项。您只需要为每个 get/set 使用一个命令命令:

    // SET
    _redis.StringSet(key, serializedPerson);
    
    // GET
    string serializedPerson = _redis.StringGet(key);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多