2

当尝试通过调用 RedisConnection.Hashes.Remove(int db, string key, string[] fields, bool queueJump = false) 删除哈希字段时,我收到一个异常消息:“'hdel' 命令的参数数量错误”。

这是产生它的代码:

    static void Main(string[] args)
    {
        var connection = new RedisConnection("localhost");
        connection.Open();

        var transaction = connection.CreateTransaction();

        // setting values to fields - works fine!
        for (int index = 0; index < 2; index++)
        {
            transaction.Hashes.Set(0, "s1", String.Format("f{0}", index.ToString()), String.Format("v{0}", index.ToString()));
        }
        transaction.Execute().Wait();

        // Here is where the exception is being thrown
        connection.Hashes.Remove(0, "s1", new string[] { "f1", "f2" }).Wait();

        Console.ReadLine();
    }

我正在使用从 nuget 获取的 Booksleeve 1.3.37.0。谢谢,

4

2 回答 2

3

来自HDEL 手册

历史

= 2.4:接受多个字段参数。早于 2.4 的 Redis 版本每次调用只能删除一个字段。

换句话说,您运行的 Redis 版本早于 2.4,因此每次调用只能删除一个字段。这很可能会奏效;

connection.Hashes.Remove(0, "s1", new string[] { "f1" }).Wait();
connection.Hashes.Remove(0, "s1", new string[] { "f2" }).Wait();

(或者当然可能有一个不带数组的调用版本)

于 2013-05-27T16:09:27.327 回答
1

BookSleeve 确实执行了版本测试,试图向您隐藏这些微妙之处;似乎问题出在版本测试本身:

    /// <summary>
    /// Does HDEL support varadic usage?
    /// </summary>
    public bool HashVaradicDelete { get { return version > v2_2_0; } }

我想应该是:

    /// <summary>
    /// Does HDEL support varadic usage?
    /// </summary>
    public bool HashVaradicDelete { get { return version >= v2_4_0; } }

阅读底部的评论,HDEL页面似乎在某些时候没有非常清楚地列出版本 - 我可能从评论中得到了我的版本测试:

当前官方稳定版(2.2)不支持多字段;我只是追了一阵子试图让它工作,直到我意识到这个页面是 2.4 的文档,而不是 2.2

我很高兴将其更改为 >= 2.4 - 但是您能确认您使用的是哪个服务器版本吗?

于 2013-05-28T15:23:16.410 回答