Мой клиент отправляет на сервер json (JObject), и у меня есть собственный метод, который сводит значение в пару ключ-значение.
Предполагая, что это мой json
{
Prop1: 12,
Prop2: "Str",
Prop3:{
Prop4: 222.4
}
}
Создается словарь сглаженных данных, который выглядит следующим образом:
"Prop1": 12
"Prop2": "Str"
"Prop3.Prop4": 222.4
Теперь я использую Redis (клиент StackExchange.Redis) для хранения этих данных.
Я генерирую ключ (например, obj:123456) и добавляю значения ключа словаря в виде хэш-записей.
Данные сохраняются в Redis, но проблема в том, что мне нужно различать типы при извлечении данных из Redis.
Я заметил флаг IsInteger
и хотел попробовать использовать его для начала. Я создал HashEntry
с целочисленным значением (IsInteger
было правдой), а затем HashSetted
данные. Когда я извлекал данные с помощью HashGet
, я заметил, что флаг IsInteger был ложным.
Есть ли причина, по которой флаг IsInteger
теряется между HashSet
и HashGet
?
Есть ли какой-нибудь тривиальный способ обработки типов (string\int\double\date) в Redis? Я могу придумать пользовательскую реализацию, но я бы хотел пойти туда.
Изменить. Вот пример кода:
Dictionary<string, object> objs = new Dictionary<string, object>
{
{"Prop1", 12},
{"Prop2", "Str"},
{"Prop3.Prop4", 222.4},
};
var redisConnection = ConnectionMultiplexer.Connect(ConfigurationOptions.Parse("localhost:6379,name=SafeRedisConnection,connectTimeout=100000,syncTimeout=100000,abortConnect=false,defaultDatabase=5"));
// just a test
var hashEntries = objs.Where(kvp => kvp.Value is int).Select(kvp => new HashEntry(kvp.Key, (int)kvp.Value));
var hashEntries1 = objs.Where(kvp => kvp.Value is string).Select(kvp => new HashEntry(kvp.Key, (string)kvp.Value));
var hashEntries2 = objs.Where(kvp => kvp.Value is double).Select(kvp => new HashEntry(kvp.Key, (double)kvp.Value));
var arr = hashEntries.Union(hashEntries1).Union(hashEntries2).ToArray();
redisConnection.GetDatabase().HashSet("obj:123456", arr);
var keys = redisConnection.GetDatabase().HashKeys("obj:123456");
var dic = keys.ToDictionary(k => k, k => redisConnection.GetDatabase().HashGet("obj:123456", k));