2013-02-20 33 views
1

排序的设置为每some suggestions正确的方法,我使用Redis的ZADD通过BookSleeve的SortedSets.Add()保存按时间顺序数据如下:检索从Redis的使用BookSleeve

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 []类型的。我认为这是保存的数据的字节数组 - 即使我将它保存为字符串?

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

+2

Booksleeve基本上充当垫片直接在[底层ZRANGE命令的顶部](http://redis.io/commands/zrange);顺便说一句,最直接的测试链接是[这里](https://code.google.com/p/booksleeve/source/browse/Tests/SortedSets.cs)。返回的byte []'只是UTF-8编码 - 还有'RangeString'可以为你做翻译。我必须“现在”去吃东西,但我稍后可以回来添加一个更完整的例子。你能澄清一下:目前有什么问题?你没有得到预期的行吗?或者只是切换到'RangeString'的情况?我该怎么帮忙? – 2013-02-21 01:57:20

+0

阅读ZRANGE文档后,我看到开始/停止值从给定范围的开始到结束为零。所以,当我使用RangeString()时,我使用0,99999(因为没有超出范围的异常抛出),我期望的全部项目。然而,我始终得到“方法或操作没有实现”的错误“。此外,不使用分数不会帮助我在这种情况下(因为得分是时间戳),我用这个范围得到。 – ElHaix 2013-02-21 14:41:46

+0

这很有趣,也没有办法,我可以推断,从问题!是否有一个堆栈跟踪?我要旋转起来的快速测试,看看我是否能瑞普与您的代码 – 2013-02-21 15:05:18

回答

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); 
+0

我添加的String.Format(” 。瓮:{0}”,thisChannel) - 这样一个完全合格的关键 – ElHaix 2013-02-21 16:57:49

+0

@ElHaix的关键是一个关键的一个关键; Redis的不关心的内容是什么,我改变了我的钥匙用'string.Format' - 它仍然可以正常工作,你能告诉我一个你正在遇到的问题的复印件吗?顺便说一句:我在这里添加一个“urn:”前缀毫无益处。 – 2013-02-21 17:49:29

相关问题