1

根据一些建议,我ZADD通过 BookSleeve使用 RedisSortedSets.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[] 类型的 Key。我假设这是保存的数据的字节数组 - 即使我将它保存为字符串?

我在这里查看了一些代码,想知道是否有关于如何使用此功能的大量文档和一些示例?

4

1 回答 1

0

我在此注意到的有趣的事情是RangeString,它应该是您的场景的理想选择,但缺少offset参数;我将纠正这一点 - 但现在,我们可以Range手动使用和解码密钥(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));
    }
}

我当然没有MethodNotImplementedException。我应该声明:我正在测试当前的“头部”,仅仅是因为那是我可用的。


供参考:在我的本地副本中,我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);
于 2013-02-21T15:18:59.040 回答