Azure Redis кеш SetString ошибка мультиплексора - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь использовать Azure кэш redis для уменьшения попаданий в мою базу данных, но я застрял на чем-то очень странном. Мой WebMethod выглядит так:

[WebMethod]
public static string HistoricalData(string searchterm, string topicId)
    {
        string constr = ConfigurationManager.ConnectionStrings["Azure"].ConnectionString;
        var lazyConnection = new Lazy<ConnectionMultiplexer>(() => {
            string cacheConnection = ConfigurationManager.ConnectionStrings["CacheConnection"].ToString();
            return ConnectionMultiplexer.Connect(cacheConnection);
        });

        JavaScriptSerializer json = new JavaScriptSerializer();
        List<HistoricalGraph> hg = new List<HistoricalGraph>();

        json.MaxJsonLength = Int32.MaxValue;

        IDatabase cache = lazyConnection.Value.GetDatabase();
        var cachedCategory = cache.StringGet(topicId).ToString();

        if (cachedCategory == null){
            using (SqlConnection conn = new SqlConnection(constr))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand("my_sp", conn))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@Type", "GetData");
                    cmd.Parameters.AddWithValue("@Topic", searchterm);

                    using (SqlDataReader r = cmd.ExecuteReader())
                    {
                        if (r.HasRows)
                        {
                            while (r.Read())
                            {
                                hg.Add(new HistoricalGraph
                                {
                                    asin = r.GetValue(0).ToString() ?? "",
                                    title = r.GetValue(1).ToString() ?? "",
                                    tagBrand = r.GetValue(2).ToString() ?? "",
                                    TagFieldValue1 = r.GetValue(3).ToString() ?? "",
                                    TagFieldValue2 = r.GetValue(4).ToString() ?? "",
                                    TagFieldValue3 = r.GetValue(5).ToString() ?? "",
                                    TagFieldValue4 = r.GetValue(6).ToString() ?? "",
                                    TagFieldValue5 = r.GetValue(7).ToString() ?? "",
                                    pack = r.GetValue(8).ToString() ?? "",
                                    date = r.GetValue(9).ToString() ?? "",
                                    avgPrice = r.GetValue(10).ToString() ?? "",
                                    units = r.GetValue(11).ToString() ?? "",
                                    revenue = r.GetValue(12).ToString() ?? "",
                                    image = r.GetValue(13).ToString() ?? ""
                                });
                            }

                        }
                    }
                }
            }
            System.Diagnostics.Debug.WriteLine("From SQL");

            var serializedData = json.Serialize(hg);
            cache.StringSet(topicId, serializedData).ToString(); //Errors here

            return serializedData;
        }
        else
        {
            System.Diagnostics.Debug.WriteLine("From Redis Cache");

            return cachedCategory.ToString();
        }
    }

Redis StackExchange выдает ошибку мультиплексора, которая не очень наглядна, но если я перезагружаю страницу, он удаляет данные json из моего кэша redis. Строка json занимает в среднем около 8 МБ. Будем весьма благодарны за любые мысли или предложения по этому вопросу.

1 Ответ

0 голосов
/ 27 апреля 2020

Ошибка выглядела примерно так:

System.TimeoutException: Timeout performing MGET 2728cc84-58ae-406b-8ec8-3f962419f641, inst: 1,mgr: Inactive, queue: 73, qu=6, qs=67, qc=0, wr=1/1, in=0/0
IOCP: (Busy=6, Free=999, Min=2,Max=1000), WORKER (Busy=7,Free=8184,Min=2,Max=8191)

Я изменил несколько вещей, чтобы она заработала.

Сначала я удалил и заново создал кеш, оставив значение TLS по умолчанию. Затем, чтобы уменьшить размер ответа, я сжимаю и распаковываю строку. Сокращение размера до более управляемой 1 МБ. Пальцы скрещены, но с тех пор я не получил ошибку мультиплексора.

...