生產併發問題的解決通過redis

1.客服系統多用戶同時排隊時,會有併發問題
1)第一時間想到的方案是加同步代碼塊,但是通過實踐證明這樣的效率低下,行不通
2)最後想到的方案是通過redis來解決併發的問題,因爲redis是單線程的,所以在每次分配完客服之後,判斷redis中是否已存在自動分配的客服id如果已存在返回"暫無客服",否則向redis裏面加一個key爲自動分配客服id的值,用來阻止其他用戶併發的分配到這個客服。執行完所有代碼後刪除redis中的值.

 			//自動分配客服,生成會話,存評分表信息
            List<SysUser> sysUserList = sysUserMapper.getByProductId(productId,SysUser.Type.kf.ordinal(),SysUser.KFStatus.on.ordinal(),Evaluate.State.on.ordinal(),CommonConstant.msgNumLimit,SysUser.Status.on.ordinal());//查詢可分配的客服列表
            if(sysUserList == null || sysUserList.size() == 0 ){
                return resultData.initCodeAndDesp(1003);//暫無在線客服
            }
            int i = new Random().nextInt(sysUserList.size());//隨機的客服
            SysUser sysUser = sysUserList.get(i);
            //1.關鍵代碼
            if(this.redisDao.hasKey(CommonConstant.REDIS_REGISTER_KEFU + sysUser.getId())){
                return resultData.initCodeAndDesp(1003);//暫無在線客服
            }
            this.redisDao.set(CommonConstant.REDIS_REGISTER_KEFU + sysUser.getId(), 1, 5);
            //返回參數
            resultMap = new HashMap<>();
            resultMap.put("token", token);
            resultMap.put("userId", imId);
            resultMap.put("msgNum",msgNum);
            resultMap.put("kfId",sysUser.getImId());
            resultMap.put("kfName", sysUser.getUsername());
            resultMap.put("isNewMsgNum", CommonConstant.isNewMsgNum);//標識 是否是新會話
            resultData.setData(resultMap);
            //2.關鍵代碼
            redisDao.del(CommonConstant.REDIS_REGISTER_KEFU + sysUser.getId());
            return resultData.initCodeAndDesp();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章