【问题标题】:how to create a high performance counter in c# using lua and redis with stackexchange如何在 c# 中使用 lua 和 redis 和 stackexchange 创建高性能计数器
【发布时间】:2021-05-09 15:15:30
【问题描述】:

我正在尝试在 c# 中创建一个简单的方法来获取我的 Redis 实例中的键数。 在 redis 中,我的键如下:

mykey:1
mykey:2
mykey:3

通过使用redis-cli,我可以运行:

eval "return #redis.pcall('keys', 'mykey:*')" 0

然后它返回:

(integer) 3

所以,我在 c# 中构建了这个函数:

public void GetThatCounter()
    {
        var script=LuaScript.Prepare("redis.pcall('keys', 'mykey:*')");
        var result=dbCache.ScriptEvaluate(script);
        Console.WriteLine("result"+result.ToString());
    }

但是,结果包含“isnull:true”,表示没有结果...

(该函数显然现在什么都不返回,我只是将它用作测试并在调试时中断代码执行,以使用 Visual Studio 编辑器挖掘结果变量)

有什么帮助吗?

【问题讨论】:

  • C#嵌入脚本中没有return语句。也许这就是原因?
  • 其实我说的是LuaScript.Prepare参数中嵌入的lua脚本,而不是C#代码...
  • 哎哟......好吧,我删除了我无用的评论并将“返回”添加到 lua 脚本中。现在它返回给我一个包含所有键(key1、key2、key3)的数组,而不仅仅是元素的数量......?!?
  • 您是否还添加了# 符号?我猜哪个给出了这个数组的大小?
  • 太棒了!!!解决了这个问题!

标签: c# redis lua stackexchange.redis


【解决方案1】:

好的,感谢 Aureliar 的 cmets,这是最终的答案:

  • 为了从 redis.pcall 中获取结果,您需要在 redis.pcall 之前添加一个“return”
  • 为了只获取数组的大小,需要在redis.call前加#
  • 我还发现,在这种情况下,您根本不需要 Lua 脚本。

所以最终的函数是这样的:

public int GetCount(string keyWithWildCards) //e.g. key:*
{           
 return (int)dbCache.ScriptEvaluate($"return #redis.pcall('keys', '{keyWithWildCards}')");
}

这将避免接收到数百万个密钥:计数将在 redis 端进行。

如果模式不匹配任何键,它将返回 0。

【讨论】:

    猜你喜欢
    • 2017-08-01
    • 1970-01-01
    • 2016-02-18
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多