您当前的位置: 首页 >  喜欢猪猪 搜索

热门搜索的并发处理,百万级并发的处理

喜欢猪猪 发布时间:2020-10-19 09:53:44 ,浏览量:3

前言:最近旅游的主页面处理搜索慢的情况,使用的机制是Redis的GetValue方式进行存储静态变量的方式,出现了Redis的timeout的情况;

解决方法以及思路:使用静态变量字典的方法进行处理

1.定义一个字典,主要是保存栏位比较少,类别、栏位、跳转地址等,一个key、一个实体类;

2.定义一个时间,每次更新字典的时候会保存一下,下次读取的时候会判断是否经过了十分钟,经过了十分钟之后,进行读取一次数据库进行更新字典;

3.进行双重锁的方式进行,避免出现锁穿透的情况

代码:

public static List GetAllTagInfo()
        {
            //System.Diagnostics.Debug.WriteLine("");
            //缓存过期&&更新动作解放状态
            if ((_campaignTagInfoData.RemoteData == null || _campaignTagInfoData.RemoteTime.AddMinutes(10) < DateTime.Now) && !CampaignRemoteData.SignRefresh)
            {

                //System.Diagnostics.Debug.WriteLine("");
                bool taskCheckCreate = false;
                lock (CampaignRemoteData.LockTask)
                {
                    if (!CampaignRemoteData.SignTask)
                    {
                        CampaignRemoteData.SignRefresh = true;//开始进入异步更新,关闭后续触发的更新通道,规避异步执行期间大量访问造成多线程创建
                        CampaignRemoteData.SignTask = true;//锁住后续并发入坑
                        taskCheckCreate = true;//判定当前请求是否需要生产第一个线程
                    }
                }
                //System.Diagnostics.Debug.WriteLine("");
                if (taskCheckCreate)
                {
                    try
                    {
                        Task.Factory.StartNew(() =>
                        {
                            try
                            {
                                //System.Diagnostics.Debug.WriteLine("");
                                List result = null;
                                using (DbContext context = new DbContext(DBOperationType.Read, DbConnection.Db_TcTourismCampaign))
                                {
                                    string strSql = $@" ";
                                    result = context.SQLContext.ExecuteQueryModels(strSql, new Tc.Gl.Framework.ORM.Attrbuites.SqlNote("", "查询营销标签信息"));
                                }
                                lock (_campaignTagInfoData)
                                {
                                    _campaignTagInfoData.RemoteData = result;
                                    _campaignTagInfoData.RemoteTime = DateTime.Now;
                                }
                            }
                            catch (Exception ex)
                            {
                                LogModel.LogRecord("CampaignRemoteDataService", "GetAllCampaignTagInfo", "", ex);
                            }
                            finally
                            {
                                CampaignRemoteData.SignRefresh = false;//异步处理完成,解放下一次的更新动作
                                CampaignRemoteData.SignTask = false;//解锁第一个线程生产
                            }
                        });
                    }
                    catch (Exception ex)
                    {
                        LogModel.LogRecord("CampaignRemoteDataService", "GetAllCampaignTagInfo_1", "", ex);
                        CampaignRemoteData.SignRefresh = false;//异步处理完成,解放下一次的更新动作
                        CampaignRemoteData.SignTask = false;//解锁第一个线程生产
                    }
                }
            }
            return _campaignTagInfoData.RemoteData ?? new List();
        }

弊端:热门搜索的字典一定是一个比较少的数据库;最好的记录是在1000行以内;

关注
打赏
查看更多评论

喜欢猪猪

暂无认证

  • 3浏览

    0关注

    217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录