使用redis实现呼叫中心消息队列 发表于 2017-11-06 | 分类于 Php 一、业务需求背景1234567一个房产项目有多个团队跟进,一个团队有多个销售。当有客户进入的时候,程序自动分配由哪个团队中的哪个销售跟进次客户团队在项目中可以设置不同的分配权重销售在团队中可以设置不同的分配权重 二、队列生成机制123456789101112131415161718192021建立数据库表1、项目表 -- 项目信息管理2、团队表 -- 团队信息管理3、销售表 -- 销售信息管理4、团队销售表 -- 团队销售关联关系表5、项目团队表 -- 项目团队关联关系表6、项目销售表 -- 项目销售关联关系表项目关联团队时,生成项目团队队列。命名projectTeam_{$pid},项目关联指定团队的销售时,生成项目团队队列。命名projectSeller_{$teamId}_{$pid}使用redis的list数据类型,lpush存储队列数据A权重为1,B权重为2,C权重为2。生成队列内容则为[A,B,B,C,C]; 三、消费队列机制123456789当客户来访时,调用分配程序,首先找到当前分配序列的团队(右进左出规则)projectTeam_{$pid},使用redis的LPOP key ,移出并获取列表的第一个元素,尔后使用RPUSH key value1 在列表最后添加刚刚移出的元素找到当前序列团队后,找当前序列团队的序列销售projectSeller_{$teamId}_{$pid},同样使用redis的LPOP key ,移出并获取列表的第一个元素,尔后使用RPUSH key value1 在列表最后添加刚刚移出的元素消费消息队列业务结束 四、队列状态查询以及队列消费日志监控1234567在linux下查看redis数据,可以使用phpRedisAdmin,但是监控消息记录,则需要自行添加日志表,结合自身业务,记录程序执行日志-- 消费队列程序流程日志表-- 生成队列程序日志表-- 当前消息队列 phpRedisAdmin 五、MySQL和Redis 数据同步1234567891011121314151617由于redis数据存在内存中,虽然缓存数据可以持久化,没有缓存时间限制。但是万一断电关机,数据将很难恢复,以此需要将redis中的数据实时备份,网上百度,可以得到很多方案由于数据量不大,更新不频繁的数据,所以我们采取方案一读: 读redis->没有,读mysql->把mysql数据写回redis写: 写mysql->成功,写redis就是读的话,先读Redis,Redis没有再读数据库,将数据库中的数据放入Redis写(增删改),先写数据库,然后写Redis方案二使用linux的定时任务crontab,每分钟执行一次同步脚本