简体   繁体   English

StackExchange TimeoutException试图在redis中插入2个集合中的750个项目

[英]StackExchange TimeoutException when trying to insert 750 items in 2 sets in redis

Initially I'm trying to insert some collection of items into 2 redis sets (maybe this is not good idea at all, but ...). 最初我试图将一些项目集合插入到2个redis集中 (也许这根本不是好主意,但是......)。 amount of entries that I'm trying to add at once: 750+ 我想要一次添加的条目数量750+

For now I do receive timeout exception when trying to perform this action using StackExchange.redis client, the interesting thing that I'm able to complete similar action using "legacy" booksleeve client I've investigated previously. 现在我在尝试使用StackExchange.redis客户端执行此操作时收到超时异常 ,有趣的是我能够使用之前调查过的“遗留”书架客户端完成类似的操作

So, I definitely wrong in something (even maybe in my intial bookSleeve implementation), just trying to figure out what exactly is wrong. 所以,我在某些方面肯定是错的(甚至可能在我的初始bookSleeve实现中),只是想弄清楚到底出了什么问题。 Below is sample of the code that I use with redis clients: BookSleeve: 下面是我与redis客户端一起使用的代码示例: BookSleeve:

using (var tran = connection.CreateTransaction())
{
Task lastOpTask = null;
tran.SuspendFlush();
try
{
    // perform required configurations/ actions
    tran.Sets.Add(_redisConfiguration.DbNumber, CurrentIdsSetDbKey, stringIds);
    tran.Sets.Add(_redisConfiguration.DbNumber, CurrentDetailsSetDbKey, stringDetails);
    lastOpTask = tran.Execute();
    isOperationSuccessful = true;
}
catch (TaskCanceledException ex)
{
    ...
}
catch (TimeoutException ex1)
{
    ...
}
finally
{
    tran.ResumeFlush();
}

if (lastOpTask != null)
{
    connection.Wait(lastOpTask);
    ...
}
}

StackExchange.redis implementation of the same code: StackExchange.redis执行相同的代码:

var tran = db.CreateTransaction();

// todo: do we need to add here any condition or PipeLining? any watch/unwatch verifications?
tran.SetAddAsync(CurrentIdsSetDbKey, stringIds);
tran.SetAddAsync(CurrentDetailsSetDbKey, stringDetails);

try
{
    isOperationSuccessful = tran.Execute();
}
catch (TaskCanceledException ex)
{
    ...
}
catch (TimeoutException ex1)
{
    ...
}

After I start unit tests I receive next error for StackExchange client: 在我开始单元测试后,我收到StackExchange客户端的下一个错误:

Message: Timeout performing EXEC, inst: 3, queue: 3, qu=0, qs=3, qc=0, wr=0/0

Source: in StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor1 processor, ServerEndPoint server) in c:\\TeamCity\\buildAgent\\work\\18a91a3757cef937\\StackExchange.Redis\\StackExchange\\Redis\\ConnectionMultiplexer.cs:line 1693 in StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor1 processor, ServerEndPoint server) in c:\\TeamCity\\buildAgent\\work\\18a91a3757cef937\\StackExchange.Redis\\StackExchange\\Redis\\RedisBase.cs:line 92 in StackExchange.Redis.RedisTransaction.Execute(CommandFlags flags) in c:\\TeamCity\\buildAgent\\work\\18a91a3757cef937\\StackExchange.Redis\\StackExchange\\Redis\\RedisTransaction.cs:line 51 in DFS.Cache.CacheManager.RedisStackExchange.RedisContestCacheManager.RegisterAvailableContests(IList1 contests) in d:\\Projects\\DFS\\Code\\DFS\\DFS.Cache.CacheManager.RedisStackExchange\\RedisContestCacheManager.cs:line 131

Just wondering, what exactly I'm doing wrong. 只是想知道,究竟我做错了什么。 Thank you in advance for any suggestions!. 提前感谢您的任何建议!

PS For stackEchange.redis configuration I'm using config sample provided by Marc from github (available here: StackExchange/StackExchange.Redis/blob/master/Docs/Configuration.md) PS对于stackEchange.redis配置我正在使用Marc从github提供的配置示例(此处可用:StackExchange / StackExchange.Redis / blob / master / Docs / Configuration.md)

PS Please see current StackExchange client Config file: PS请查看当前的StackExchange客户端配置文件:

var config = new ConfigurationOptions
{
    EndPoints =
        {
            {"MasterIP", 6379},
            {"SlaveIP", 6380}
        },
    CommandMap = CommandMap.Create(new HashSet<string>
        {
            // EXCLUDE a few commands (to work with data-flow-related mode only)
            "INFO",
            "CONFIG",
            "CLUSTER",
            "PING",
            "ECHO",
            "CLIENT"
        }, available: false),
    KeepAlive = 60, // 60 sec to ensure connection is alive
    ConnectTimeout = 5000, // 5 sec
    SyncTimeout = 5000, // 5 sec
    ServiceName = "mymaster", // sentinel service name
    DefaultVersion = new Version(2, 8, 8),
    Password = "password"
};

Standard entry (used in sets) looks like: 标准条目(在集合中使用)看起来像:

{
    "Id":"08e5ffdbced046cb8f55c50e4bab822d",
    "Entries":0,
    "State":"i",
    "Name":"very dummy entry name value: autoGet 299",
    "Summary": "entry summary details, some long string 299, some common info, some data: true, 8200"
    "IsMultiple":true,
    "IsPublic":true,
    "MaxEntries":8200,
    "IsEntryVisible":true,
    "StartDate":"9/10/2014 12:00:00 AM"
}

PS After Marc's response I ran couple of tests and got some other errors in Unit tests, for example PS在Marc的回应之后,我进行了几次测试,并在单元测试中遇到了一些其他错误

{"Timeout performing SISMEMBER set:raw:Ids, inst: 1, queue: 6, qu=0, qs=6, qc=0, wr=0/0"} when set contains not more than 300 items. 

So I agree that this is Connection issue and has nothing to do with current switch to the StackExchange.redis client. 所以我同意这是Connection问题,与当前切换到StackExchange.redis客户端无关。

The following passes just fine, and reports 10ms locally. 以下传递正常,并在本地报告10毫秒。 I would be very interested if you could fill in the blanks a bit so I can do a representative test that reproduces the issue. 如果你能填补空白,我会非常感兴趣,所以我可以做一个代表性的测试来重现这个问题。 Note that qu=0, qs=3 tells me that at the point that it times out, we're waiting for the redis server to respond. 请注意, qu=0, qs=3告诉我,当它超时时,我们正在等待redis服务器响应。 Obviously local bandwidth and latency would be of interest, but fundamentally, it should work . 显然,本地带宽和延迟会引起人们的兴趣,但从根本上说, 它应该可行 I'd also be interested in what your sync-timeout is set to. 我也对你的sync-timeout设置的内容感兴趣。

using System.Diagnostics;
using System.Linq;
using NUnit.Framework;

namespace StackExchange.Redis.Tests.Issues
{
    [TestFixture]
    public class SO22786599 : TestBase
    {
        [Test]
        public void Execute()
        {
            string CurrentIdsSetDbKey = Me() + ".x";
            string CurrentDetailsSetDbKey = Me() + ".y";

            RedisValue[] stringIds = Enumerable.Range(1, 750).Select(i => (RedisValue)(i + " id")).ToArray();
            RedisValue[] stringDetails = Enumerable.Range(1, 750).Select(i => (RedisValue)(i + " detail")).ToArray();

            using (var conn = Create())
            {
                var db = conn.GetDatabase();
                var tran = db.CreateTransaction();

                tran.SetAddAsync(CurrentIdsSetDbKey, stringIds);
                tran.SetAddAsync(CurrentDetailsSetDbKey, stringDetails);

                var watch = Stopwatch.StartNew();
                var isOperationSuccessful = tran.Execute();
                watch.Stop();
                System.Console.WriteLine("{0}ms", watch.ElapsedMilliseconds);
                Assert.IsTrue(isOperationSuccessful);                
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM