使用redis实现呼叫中心消息队列

一、业务需求背景

1
2
3
4
5
6
7
一个房产项目有多个团队跟进,一个团队有多个销售。
当有客户进入的时候,程序自动分配由哪个团队中的哪个销售跟进次客户
团队在项目中可以设置不同的分配权重
销售在团队中可以设置不同的分配权重

二、队列生成机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
建立数据库表
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];

三、消费队列机制

1
2
3
4
5
6
7
8
9
当客户来访时,调用分配程序,首先找到当前分配序列的团队(右进左出规则)projectTeam_{$pid},使用redis的LPOP key ,
移出并获取列表的第一个元素,尔后使用RPUSH key value1 在列表最后添加刚刚移出的元素
找到当前序列团队后,找当前序列团队的序列销售projectSeller_{$teamId}_{$pid},同样使用redis的LPOP key ,
移出并获取列表的第一个元素,尔后使用RPUSH key value1 在列表最后添加刚刚移出的元素
消费消息队列业务结束

四、队列状态查询以及队列消费日志监控

1
2
3
4
5
6
7
在linux下查看redis数据,可以使用phpRedisAdmin,但是监控消息记录,则需要自行添加日志表,结合自身业务,记录程序执行日志
-- 消费队列程序流程日志表
-- 生成队列程序日志表
-- 当前消息队列 phpRedisAdmin

五、MySQL和Redis 数据同步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
由于redis数据存在内存中,虽然缓存数据可以持久化,没有缓存时间限制。但是万一断电关机,数据将很难恢复,以此需要将redis中的数据实时备份,网上百度,可以得到很多方案
由于数据量不大,更新不频繁的数据,所以我们采取
方案一
读: 读redis->没有,读mysql->把mysql数据写回redis
写: 写mysql->成功,写redis
就是读的话,先读Redis,Redis没有再读数据库,将数据库中的数据放入Redis
写(增删改),先写数据库,然后写Redis
方案二
使用linux的定时任务crontab,每分钟执行一次同步脚本