根据some suggestions,我使用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中,集合包含double值,以及类型为Byte []的Key。我假设这是保存数据的字节数组 - 即使我将其保存为字符串?
我已经审核了一些代码here,想知道是否有大量文档和一些如何使用此功能的示例?
答案 0 :(得分: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);