使用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。我假设这是保存的数据的字节数组——即使我将其保存为字符串?
我在这里查看了一些代码,想知道是否有关于如何使用此函数的大量文档和一些示例?
我在这篇文章中注意到的一件有趣的事情是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);