gpt4 book ai didi

c# - 如何处理 Redis 哈希的强类型?

转载 作者:IT王子 更新时间:2023-10-29 06:06:26 24 4
gpt4 key购买 nike

我的客户端向服务器发送一个 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 标志在 HashSetHashGet 之间丢失是否有任何原因?

有什么简单的方法可以通过 Redis 处理类型(string\int\double\date)?我可以想到自定义实现,但我想去那里。

编辑 - 这是一个代码示例:

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));

最佳答案

您应该使用自己的 Redis 键命名约定。请记住,在 Redis 中,所有简单值都是字符串(好吧,字节数组...但是StackExchange.Redis 有一个隐式运算符将 RedisValue 转换为 string )。

例如,当您在某些 Redis 哈希上添加一个时,键可能是 <propertyName>:<type>,这样您就可以再次将键值转换为 CLR 类型...

另一种方法可以同时存储该哈希值和另一个哈希值,以存储 key 的数据类型:

var hashEntries = objs.Where(kvp => kvp.Value is int)
.Select
(
kvp => new HashEntry
(
kvp.Key,
kvp.Value.GetType().AssemblyQualifiedName
)
);

每当您获得部分或全部哈希条目时,您还可以获得它的只是元数据对应物以检查每个值类型。

顺便说一句,我认为您真的应该考虑将 JSON 序列化对象注入(inject)到全局/分区哈希中,或者使用简单的键字符串键作为全局键空间的一部分,这样您就可以避免这些问题。

如果我需要执行某些操作(例如按某些属性或其他情况索引数据),我会使用散列来存储单个属性...但如果您只是存储完整的对象,请考虑我的目的方法。

关于c# - 如何处理 Redis 哈希的强类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37372625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com