Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一次调用中从Redis读取多个哈希_C#_Redis_Stackexchange.redis - Fatal编程技术网

C# 在一次调用中从Redis读取多个哈希

C# 在一次调用中从Redis读取多个哈希,c#,redis,stackexchange.redis,C#,Redis,Stackexchange.redis,我想从Redis中的多个散列中搜索具有最高值的键。我的钥匙是这种格式的- emp:1, emp:2,...emp:n 每个都具有此格式的值- 1. name ABC 2. salary 1234 3. age 23 我想从这些散列中找到最老的员工。从我读到的关于Redis的内容来看,无法在一次调用中读取多个哈希值。这意味着我需要遍历所有emp键,并在每个键上调用HGETALL以获得所需的结果。我确实有一个存储所有emp ID的集合 有什么方法可以使点击次数最小化以使其正常工作吗?您可以使用R

我想从Redis中的多个散列中搜索具有最高值的键。我的钥匙是这种格式的-

emp:1, emp:2,...emp:n
每个都具有此格式的值-

1. name ABC
2. salary 1234
3. age 23
我想从这些散列中找到最老的员工。从我读到的关于Redis的内容来看,无法在一次调用中读取多个哈希值。这意味着我需要遍历所有emp键,并在每个键上调用HGETALL以获得所需的结果。我确实有一个存储所有emp ID的集合


有什么方法可以使点击次数最小化以使其正常工作吗?

您可以使用Redis中的管道来运行多个命令并获取它们的响应。这应该允许您执行多个HGETALL命令。有关更多信息,请参阅。不确定您正在为C使用什么库,但它应该为您提供一种使用管道的方法

您还可以创建一个Lua脚本来迭代Redis键,并返回最老员工的哈希值

tldr; 是的,你是对的

。。。无法在一次调用中读取多个哈希值

事实也是如此

。。。您还可以创建一个Lua脚本来迭代Redis键

增加 看起来您正在使用Redis作为数据库。您已经存储了所有域数据,现在需要查询它。这是对Redis的滥用。这是可以做到的,但这不是它的目的。对于此活动,如果使用真实的数据库,它将更容易、更高效

Redis用于缓存经常使用的数据[注:1]。请注意经常使用的两个词1缓存和2。缓存是临时存储的。如果您想要永久存储—在服务器重新启动后—请选择数据库。常用的说法是不要将所有数据都存储在那里。仅存储当前正在使用的子集。您可以在所有数据中使用Redis,甚至在打开永久存储的情况下也可以使用Redis,但之后您必须非常小心

出于您的目的,它似乎使用一个通用数据库,并从中选择MAXage。。。即使不是更好也同样好

或者, 您只引用了真实问题的一部分,实际上您正在遵循Redis最佳实践。在这种情况下,我建议使用单独的排序集。对于插入到主密钥集中的每个员工,也要使用ZADD employeeages 80 Alen,其中80是年龄,Alen可能是人员Alen的ID

要获取具有最大年龄的个人ID,您可以执行以下操作

ZREVRANGEBYSCORE employeeages +inf -inf WITHSCORES LIMIT 0 1
如果这看起来很奇怪,那么你是对的-这是非常有趣的事情!这将不仅在一次呼叫中获得您的数据,而且在该呼叫的一个步骤中获得您的数据!考虑一下:假设你有一百万名员工。然后这种获取最年长员工的方法将是最快的,使用数据库并选择MAX。。。将获得亚军,您的HGETALL或Lua脚本将是最慢的

如果员工的年龄经常变化,比如在线游戏玩家的分数,并且你经常想查询排名靠前或靠后的人,比如更新排行榜,那么就使用这种方法。使用这种方法代替数据库的缺点是高冗余。当你说员工的地址发生变化时,你需要改变很多记录,要做到这一点,你需要打很多电话


[1] 如评论中所述,Redis不仅仅是一个用于频繁使用数据的缓存。我相信对于这次讨论来说,这个定义就足够了

非常感谢你给出了一个很好的答案:这个答案很好,但完全不同意Redis的意思是将频繁使用的数据作为定义进行缓存。对于v1.0来说,这可能是真的,但Redis已经取得了长足的进步。@ItamarHaber感谢您指出:我本想添加一个脚注,但忘记了。现在更新!另外,另一种方法实际上是将感兴趣的关键名称存储在另一个数据结构中(例如,排序集),该数据结构允许查询并随后根据用例的需求读取它们。