C# 使用BookSleeve从Redis检索排序集的正确方法

C# 使用BookSleeve从Redis检索排序集的正确方法,c#,.net,date,booksleeve,C#,.net,Date,Booksleeve,根据,我使用Redis'ZADD通过BookSleeve的SortedSets.Add()按时间顺序保存数据,如下所示: TimeSpan span = DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0)); _connection.SortedSets.Add(_db, thisChannel, message, span.TotalSeconds, false); 使用ServiceStack的AdminUI,我可以看到隐

根据,我使用Redis'
ZADD
通过BookSleeve的
SortedSets.Add()
按时间顺序保存数据,如下所示:

TimeSpan span = DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0)); 
_connection.SortedSets.Add(_db, thisChannel, message, span.TotalSeconds, false);
使用ServiceStack的AdminUI,我可以看到隐藏在Redis中的值

这些值存储为UTC,我现在希望能够获得返回值的范围

简单地说,由于我最近保存了这些值,我尝试:

var subset = _connection.Wait(_connection.SortedSets.Range(_db, thisChannel, span.TotalSeconds - 10000, span.TotalSeconds, offset: 0, count: 50));
在VS中,集合包含双精度值和Byte[]类型的键。我假设这是保存的数据的字节数组-即使我将其保存为字符串


我已经阅读了一些代码,想知道是否有关于如何使用此函数的大量文档和一些示例?

我注意到有趣的是,
RangeString
,它应该非常适合您的场景,缺少
offset
参数;我将纠正这一点-但现在,我们可以使用
范围
并手动解码密钥(redis允许二进制密钥;它们不需要是字符串);但是,以下各项成功通过:

[Test]
public void SO14991819()
{
    const int _db = 0;
    const string thisChannel = "SO14991819";
    const string message = "hi";
    using (var _connection = Config.GetUnsecuredConnection())
    {
        _connection.Keys.Remove(_db, thisChannel); // start from known state

        TimeSpan span = DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0));
        double val = span.TotalSeconds;

        _connection.SortedSets.Add(_db, thisChannel, message, val, false);

        var subset = _connection.Wait(_connection.SortedSets.Range(
            _db, thisChannel, span.TotalSeconds - 10000, span.TotalSeconds, offset: 0, count: 50));

        Assert.AreEqual(1, subset.Length);
        Config.AssertNearlyEqual(val, subset[0].Value);
        Assert.AreEqual(message, Encoding.UTF8.GetString(subset[0].Key));
    }
}
我当然不会得到
方法NotImplementedException
。我应该声明:我正在测试当前的“头”,仅仅因为这是我可用的


仅供参考:在我的本地副本中,我实现了带有偏移量/计数的
RangeString
,因此,以下过程:

var subset = _connection.Wait(_connection.SortedSets.RangeString(
    _db, thisChannel, span.TotalSeconds - 10000, span.TotalSeconds, offset: 0, count: 50));

Assert.AreEqual(1, subset.Length);
Config.AssertNearlyEqual(val, subset[0].Value);
Assert.AreEqual(message, subset[0].Key);

书套的作用基本上是直接在书桌顶部起垫片的作用;顺便说一句,最直接的测试链接是。返回的
byte[]
只是UTF-8编码的-还有
RangeString
为您进行翻译。我必须“现在”去买食物,但我可以稍后回来补充一个更完整的例子。你能否澄清一下:目前的问题是什么?您是否没有得到预期的行?或者只是切换到
范围字符串
?我能提供什么帮助?阅读ZRANGE文档,我发现开始/停止值是从零开始到给定范围结束的。因此,当我使用RangeString()时,我使用0,99999(因为没有抛出超出范围的异常),我希望所有项目都是这样。但是,我始终得到“方法或操作未实现”错误。此外,在这种情况下,不使用分数对我没有帮助(因为分数是时间戳)我用它来表示距离。这很有趣,我无法从这个问题中推断出来!有没有stacktrace呢?我要做一个快速测试,看看我是否可以用你的代码重新编程,我添加了String.Format(“urn:{0},thisChannel)-因此是一个完全限定的密钥。@ElHaix一个密钥就是一个密钥;redis不在乎内容是什么。我用
string.Format
-更改了密钥,它仍然可以正常工作。你能给我一个你遇到的问题的重现吗?顺便说一句:我认为在这里添加
“urn:
前缀绝对没有任何好处。。。