使用 HashTable 将对象作为值保存在 Redis 中

Keep an object as a value in Redis using its HashTable

我是 Redis 的新手,我正在尝试编写一个简单的项目,从 SQL 数据库收集信息并缓存到 Redis 中。因为我更习惯table使用C#,所以我选择了StackExchange.Redis来做到这一点。

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

这是我如何执行此操作的代码。

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 的值(在我看来是一个哈希表)绑定到我现有的对象?

My question is, Is there any way I can Bind automatically the value of Redis (that is in my way a HashTable) to my existing object?

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

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

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

使用一个命令命令
// SET
_redis.StringSet(key, serializedPerson);

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