2017-04-12 12 views
2

我想在單次調用中使用鍵列表從Redis獲取所有集合。根據文檔,Redis提供了SSCAN命令,但由於我使用StackExchange.Redis作爲Redis適配器,我猜這個命令在這個適配器中沒有任何這樣的方法。因此,有兩件事我要找:如何使用某些命令或LUA腳本讀取存儲在Redis上的多個集合

  • 我期待着執行SSCAN使用LUA腳本,但沒能找到在互聯網上的任何這樣的例子。任何人都可以分享如何使用多個SET鍵從LUA調用SSCAN。
  • 同樣對於StackExchange.Redis,如果我在事務中執行多個SetMembers(),它是否類似於使用SSCAN()命令使用LUA腳本?

感謝

+1

'SCAN'命令被設計用於迭代而不會阻塞服務器。從一個阻塞的Lua腳本中使用它們,有點失敗了。 –

+0

@ItamarHaber感謝您的建議,這是非常好的。但是我仍然堅持通過傳遞Set鍵列表來獲取多個集合的挑戰。有什麼知識可以分享嗎? – Riky

回答

0

的C#示例代碼來獲得多套在一個單一的呼叫如下: 我使用StackExchange.Redis作爲Redis的連接器:

using StackExchange.Redis; 
using System; 
using System.Text; 

namespace RedisGetMultipleKeys 
{ 
/// <summary> 
/// Class to perofrme operations on SE.Redis 
/// </summary> 
class Program 
{ 
    /// <summary> 
    /// Executes necessary pre-requisites 
    /// </summary> 
    /// <param name="args"></param> 
    static void Main(string[] args) 
    { 

     //Connect Redis 
     var _cache = Program.Connect(); 

     //Store 10k Sets 
     string prefix = "user"; 
     StringBuilder keys = new StringBuilder(); 
     for (int i = 0; i < 10000; i++) 
     { 
      keys.Append(" " + prefix + i); 
      _cache.SetAdd(prefix + i, i); 
     } 

     var keyList = new RedisKey[10000]; 
     //Generate keys array 
     for (int i = 0; i < 10000; i++) 
     { 
      var key = new RedisKey(); 
      key = prefix + i; 
      keyList.SetValue(key, i); 
     } 

     var startTime = DateTime.Now; 
     //Perform SUNION 
     var values = _cache.SetCombine(SetOperation.Union, keyList); 

     var endTime = DateTime.Now; 
     TimeSpan diff = endTime.Subtract(startTime); 

     Console.WriteLine("total time taken to read 10k keys = " + diff); 
     Console.Read(); 

     //TODO: to be changed accordingly to read Set values returned other than String 
     foreach (var value in values) 
     { 
      Console.WriteLine(value.ToString()); 
     } 

     endTime = DateTime.Now; 
     diff = endTime.Subtract(startTime); 

     Console.WriteLine("total time taken to read 10k keys = " + diff); 
     Console.Read(); 

    } 


    /// <summary> 
    /// Connects to Redis db 
    /// </summary> 
    /// <returns>Returns an instance of Redis db</returns> 
    private static IDatabase Connect() 
    { 
     string redisConnection = "localhost:6379,ssl=false,allowAdmin=true,ConnectRetry=3,ConnectTimeout=5000,defaultDatabase=1"; 
     ConnectionMultiplexer connection = ConnectionMultiplexer.Connect(redisConnection); 
     return connection.GetDatabase(); 
    } 
} 

}

我希望這將有助於C#開發人員正在尋找解決方案。感謝SE.Redis dev團隊的Mgravell通過他的建議來幫助我。更多的討論可以在這裏找到GitHub How to get multiple sets by passing set key list in a single call

2

通過傳遞一組密鑰列表獲得在一次調用多套

我不清楚這裏的具體要求,所以有可能是幾種方法可以做到那。最簡單的方法是調用SUNION,它將重複數據刪除並返回無序結果。

另一種選擇是使用Lua中,如:

local reply = {} 
for i = 1,#KEYS do 
    local elems = redis.call('SMEMBERS', KEYS[i]) 
    table.insert(reply, elems) 
end 
return reply 

Redis的-CLI例子(對不起,.NET是不是我的專長):

$ redis-cli SADD s1 foo bar 
(integer) 2 
$ redis-cli SADD s2 baz qaz 
(integer) 2 
$ redis-cli --eval script.lua s1 s2 
1) 1) "foo" 
    2) "bar" 
2) 1) "baz" 
    2) "qaz" 

注意:如果您的集合中有很多成員,然後無論採用何種方法,都將會「昂貴」 - 重新考慮對此的需求。

+0

謝謝@Itamar,你的回答很好地滿足了我現在的要求。當然,我會考慮你的建議,以限制Set成員的大小。目前,任何一組的成員不應超過5人。 – Riky

相關問題