如何使用某些命令或 LUA 脚本读取存储在 Redis 上的多个集合
How to read multiple Sets stored on Redis using some command or LUA script
我想在一次调用中使用键列表从 Redis 获取所有集合。根据文档,Redis 为此提供了 SSCAN 命令,但由于我使用 StackExchange.Redis 作为 Redis 适配器,我猜该命令在此适配器中没有任何此类方法。所以我正在寻找两件事:
- 我期待使用 LUA 脚本执行 SSCAN,但无法在 Internet 上找到任何此类示例。谁能分享如何使用多个 SET 键从 LUA 调用 SSCAN。
- 同样对于 StackExchange.Redis,如果我在一个事务中执行多个 SetMembers(),是否类似于使用 LUA 脚本使用 SSCAN() 命令?
谢谢
get multiple sets in a single call by passing list of Set keys
我不清楚这里的具体要求,所以可能有几种方法可以做到这一点。最简单的方法是调用 SUNION
,这将删除重复数据并 return 结果 w/o 顺序。
另一种选择是使用 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"
注意:如果您的 Set 有很多成员,那么获取所有成员,无论采用何种方法,都将是 "expensive" - 重新考虑这样做的必要性。
在一次调用中获取多个 SET 的示例 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# 开发者有所帮助。感谢Mgravell from SE.Redis dev team for helping me by his suggestions. More discussion could be found here at GitHub How to get multiple sets by passing set key list in a single call
我想在一次调用中使用键列表从 Redis 获取所有集合。根据文档,Redis 为此提供了 SSCAN 命令,但由于我使用 StackExchange.Redis 作为 Redis 适配器,我猜该命令在此适配器中没有任何此类方法。所以我正在寻找两件事:
- 我期待使用 LUA 脚本执行 SSCAN,但无法在 Internet 上找到任何此类示例。谁能分享如何使用多个 SET 键从 LUA 调用 SSCAN。
- 同样对于 StackExchange.Redis,如果我在一个事务中执行多个 SetMembers(),是否类似于使用 LUA 脚本使用 SSCAN() 命令?
谢谢
get multiple sets in a single call by passing list of Set keys
我不清楚这里的具体要求,所以可能有几种方法可以做到这一点。最简单的方法是调用 SUNION
,这将删除重复数据并 return 结果 w/o 顺序。
另一种选择是使用 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"
注意:如果您的 Set 有很多成员,那么获取所有成员,无论采用何种方法,都将是 "expensive" - 重新考虑这样做的必要性。
在一次调用中获取多个 SET 的示例 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# 开发者有所帮助。感谢Mgravell from SE.Redis dev team for helping me by his suggestions. More discussion could be found here at GitHub How to get multiple sets by passing set key list in a single call