使用 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);
我是 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);