我对 Redis 很陌生,并且正在评估它。我从这里使用 Redis 服务器:https : //github.com/downloads/dmajkic/redis/redis-2.4.5-win32-win64.zip
我还在服务器上使用以下配置:
端口 6379 超时 300 保存 900 1 保存 300 10 保存 60 10000 日志级别调试日志文件标准输出数据库 1 maxclients 32 maxmemory 2147483648
我正在尝试使用 ServiceStack 客户端 (ServiceStack-ServiceStack.Redis-4add28a) 运行这样的代码
这是我的代码
public void InsertInsideTransaction(bool shouldTransactionRollback)
{
RedisClient transClient = new RedisClient("localhost");
ClearAll();
using (var trans = transClient.CreateTransaction())
{
trans.QueueCommand(r =>
{
var redisUsers = r.GetTypedClient<User>();
var sacha = new User { Id = redisUsers.GetNextSequence(), Name = "Sacha Barber" };
redisUsers.Store(sacha);
//redisUsers.Dispose();
});
//commit or rollback based on incoming flag
if (shouldTransactionRollback)
trans.Rollback();
else
trans.Commit();
IList<User> users = Users();
Console.WriteLine(string.Format("InsertInsideTransaction : There are currently {0}, Users", users.Count()));
}
}
Run Code Online (Sandbox Code Playgroud)
User 看起来像这样(来自 ServiceStack 附带的示例之一)
public class User
{
public User()
{
this.BlogIds = new List<long>();
}
public long Id { get; set; }
public string Name { get; set; }
public List<long> BlogIds { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我尝试提交事务时出现此异常
多请求的未知回复:43QUEUED,sPort:60793,LastCommand:EXEC
在 C:\Users\barbers\Desktop\Downloads\ServiceStack-ServiceStack.Redis-4add28a\ServiceStack-ServiceStack.Redis-4add28a\src\ServiceStack.Redis\RedisNativeClient_Utils.cs 中的 ServiceStack.Redis.RedisNativeClient.CreateResponseError(String error): C:\Users\barbers\Desktop\Downloads\ServiceStack-ServiceStack.Redis-4add28a\ServiceStack-ServiceStack.Redis-4add28a\src\ServiceStack.Redis\RedisNativeClient_Utils.cs 中 ServiceStack.Redis.RedisNativeClient.ReadMultiDataResultCount() 的第 146 行:第 578 行位于 C:\Users\barbers\Desktop\Downloads\ServiceStack-ServiceStack.Redis-4add28a\ServiceStack-ServiceStack.Redis-4add28a\src\ServiceStack.Redis\Pipeline\ 中的 ServiceStack.Redis.Pipeline.QueuedRedisOperation.ProcessResult() QueuedRedisOperation.cs:ServiceStack.Redis.RedisTransaction.Commit() 中的第 169 行,C 语言:\Users\barbers\Desktop\Downloads\ServiceStack-ServiceStack.Redis-4add28a\ServiceStack-ServiceStack.Redis-4add28a\src\ServiceStack.Redis\Transaction\RedisTransaction.cs:在 DocumentDB.Redis.RedisMessAround.InsertInsideTransaction(Boolean shouldTransactionRollback) 的第 100 行) 在 C:\Users\barbers\Desktop\DocumentDBs\DocumentDB.Redis\RedisMessAround.cs:line 63 at DocumentDB.Redis.Program.Run() in C:\Users\barbers\Desktop\DocumentDBs\DocumentDB.Redis\Program .cs:line 45 at DocumentDB.Redis.Program.Main(String[] args) in C:\Users\barbers\Desktop\DocumentDBs\DocumentDB.Redis\Program.cs:line 18 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly , String[] args) 在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc。RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback) , 对象状态)在 System.Threading.ThreadHelper.ThreadStart()
然后我认为 Redis ServiceStack 家伙在他们的单元测试中使用事务来工作,所以我编辑了“RedisTransactionTests”而不是我正在使用的 ServiceStack 客户端 (ServiceStack-ServiceStack.Redis-4add28a)
这是我添加到“RedisTransactionTests”中的内容
public class User
{
public User()
{
this.BlogIds = new List<long>();
}
public long Id { get; set; }
public string Name { get; set; }
public List<long> BlogIds { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我在哪里有这个编辑过的测试代码
[Test]
[TestCase(true)]
[TestCase(false)]
public void TestUserTrans(bool shouldTransactionRollback)
{
int count = 0;
IRedisTransaction trans = Redis.CreateTransaction();
try
{
trans.QueueCommand(r =>
{
var redisUsers = r.GetTypedClient<User>();
var sacha = new User { Id = redisUsers.GetNextSequence(), Name = "Sacha Barber" };
redisUsers.Store(sacha);
});
//commit or rollback based on incoming flag
if (shouldTransactionRollback)
trans.Rollback();
else
trans.Commit();
}
catch (Exception ex)
{
}
IList<User> users = Users();
count = users.Count();
Console.WriteLine(string.Format("TestUserTrans : There are currently {0}, Users", users.Count()));
if (shouldTransactionRollback)
Assert.That(count == 0);
else
Assert.That(count == 1);
}
Run Code Online (Sandbox Code Playgroud)
在那里,异常似乎完全被吞没了。
我到底做错了什么
您无法在同一事务中读取和使用结果。
请务必阅读 MULTI/EXEC 的工作原理:http : //redis.io/topics/transactions
它通过在单个复合命令中批量处理多个命令来有效地工作,该命令由 Redis 一次性发送和处理。
在您的示例中,您试图读取redisUsers.GetNextSequence()并使用排队事务中的结果。您不能这样做,相反,如果您想在排队的事务中使用变量,则需要先阅读它:
var sacha = new User {
Id = Redis.As<User>().GetNextSequence(), Name = "Sacha Barber" };
trans.QueueCommand(r => r.As<User>().Store(sacha));
Run Code Online (Sandbox Code Playgroud)
注意:.As<T>()是一个简写r.GetTypedClient<T>()
为了读取事务的完整性,您可以发出WATCH命令来指定您的事务将使用的所有变量。然后,如果在事务完成之前修改了这些变量中的任何一个,则会引发异常并且不会执行任何排队操作。
| 归档时间: |
|
| 查看次数: |
2627 次 |
| 最近记录: |