2013-02-20 54 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

相關問題