たとえば、Customerというモデルがある場合
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address1 { get; set; }
public string City { get; set; }
public string State { get; set; }
}
例:
var customers = new List<Customer>();
顧客リストを追加するにはどうすればよいですか?どうすればよいですか?
using (var redis = ConnectionMultiplexer.Connect(this.redisServer))
{
var db = redis.GetDatabase();
db.SetAdd(key, ?????);
}
SetAddが正しい方法だと思いますが、Customerの汎用リスト(つまり、RedisValueの形式のリスト)を取得する方法がわかりません。
StackExchange.Redisは生のクライアントです-Redisの用語でのみ話します。いかなる種類のORMでもありません。ただし、スローしたいstring
またはbyte[]
は保存されます。つまり、シリアライザを選択する必要があります。 (protobuf-netを介して)自分でプロトコルバッファを使用する傾向がありますが、JSONは妥当なデフォルトです(Jilは素晴らしいです)。
リストのセマンティクスを使用する場合は、List *コマンドから始めることを強くお勧めします-セットはリストとは異なるセマンティクスを持ちます-セットは順序付けされておらず、一意の値のみを保存します。リストは順序を保持し、重複を許可します。
それが役立つかもしれません。 StackExchange.Redisに飛び込んだときも、同じ質問に直面しました。私のプロジェクトでは2つの拡張メソッドを作成しました。これは、Redisデータベースの複合型をシリアル化/逆シリアル化するのに役立ちます。必要に応じてそれらを拡張できます。
メソッド:
public static class RedisUtils
{
//Serialize in Redis format:
public static HashEntry[] ToHashEntries(this object obj)
{
PropertyInfo[] properties = obj.GetType().GetProperties();
return properties.Select(property => new HashEntry(property.Name, property.GetValue(obj).ToString())).ToArray();
}
//Deserialize from Redis format
public static T ConvertFromRedis<T>(this HashEntry[] hashEntries)
{
PropertyInfo[] properties = typeof(T).GetProperties();
var obj = Activator.CreateInstance(typeof(T));
foreach (var property in properties)
{
HashEntry entry = hashEntries.FirstOrDefault(g => g.Name.ToString().Equals(property.Name));
if (entry.Equals(new HashEntry())) continue;
property.SetValue(obj, Convert.ChangeType(entry.Value.ToString(), property.PropertyType));
}
return (T)obj;
}
}
使用法:
var customer = new Customer
{
//Initialization
};
Db.HashSet("customer", customer.ToHashEntries());
Customer result = Db.HashGetAll("customer").ConvertFromRedis<Customer>();
Assert.AreEqual(customer.FirstName, result.FirstName);
Assert.AreEqual(customer.LastName, result.LastName);
Assert.AreEqual(customer.Address1, result.Address1);
Null-ableプロパティまたはnull値を処理するためのAndrey Gubalの答えの改善:
public static class RedisUtils
{
//Serialize in Redis format:
public static HashEntry[] ToHashEntries(this object obj)
{
PropertyInfo[] properties = obj.GetType().GetProperties();
return properties
.Where(x=> x.GetValue(obj)!=null) // <-- PREVENT NullReferenceException
.Select(property => new HashEntry(property.Name, property.GetValue(obj)
.ToString())).ToArray();
}
//Deserialize from Redis format
public static T ConvertFromRedis<T>(this HashEntry[] hashEntries)
{
PropertyInfo[] properties = typeof(T).GetProperties();
var obj = Activator.CreateInstance(typeof(T));
foreach (var property in properties)
{
HashEntry entry = hashEntries.FirstOrDefault(g => g.Name.ToString().Equals(property.Name));
if (entry.Equals(new HashEntry())) continue;
property.SetValue(obj, Convert.ChangeType(entry.Value.ToString(), property.PropertyType));
}
return (T)obj;
}
}
これはオプションです
public static class StackExchangeRedisExtensions
{
public static T Get<T>(string key)
{
var connect = AzureredisDb.Cache;
var r = AzureredisDb.Cache.StringGet(key);
return Deserialize<T>(r);
}
public static List<T> GetList<T>(string key)
{
return (List<T>)Get(key);
}
public static void SetList<T>(string key, List<T> list)
{
Set(key, list);
}
public static object Get(string key)
{
return Deserialize<object>(AzureredisDb.Cache.StringGet(key));
}
public static void Set(string key, object value)
{
AzureredisDb.Cache.StringSet(key, Serialize(value));
}
static byte[] Serialize(object o)
{
if (o == null)
{
return null;
}
BinaryFormatter binaryFormatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream())
{
binaryFormatter.Serialize(memoryStream, o);
byte[] objectDataAsStream = memoryStream.ToArray();
return objectDataAsStream;
}
}
static T Deserialize<T>(byte[] stream)
{
if (stream == null)
{
return default(T);
}
BinaryFormatter binaryFormatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream(stream))
{
T result = (T)binaryFormatter.Deserialize(memoryStream);
return result;
}
}
}
AzureredisDb.CacheはСonnectionMultiplexer.ConnectおよびGetDatabase();です。