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

本文关键字:方法 排序 BookSleeve Redis 检索 使用 | 更新日期: 2023-09-27 18:00:23

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

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

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

我在这篇文章中注意到的一件有趣的事情是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);