场景
先说下我这边的场景,我们的项目中是包含聊天功能的,我们服务的对象主要是医院的医生,患者在网上找医生问诊时,往往会出现不停问的情况。
医生目前唯一的做法是自己结束这个咨询,或等待系统自动结束,这就带来了一个问题,不管是系统结束还是医生手动结束,患者都喜欢投诉和打差评,导致医生不敢擅自结束,问烦了又不好不回复,不回复也要被投诉。
最终聊天回合制这个需求就摆出来了,主动告诉患者我们的聊天是有回合的,所以你要一次问清楚,回合数满了我们不会再回复,如果患者硬要投诉,医生也可以说,这是做这个产品的公司自己设定的。
结下来就是,我们要把锅端好。
实际上,聊天回合制的诞生,基本上都和这个场景的诉求类似,为了减少用户频繁且无休止的咨询。
思路
结合redis能够很好的实现聊天回合制,当然也可以直接通过数据库来实现,但显然redis操作更简单性能更优越。
总体思路如下:
1)、redis中存储两个key,一个是表示对象,声明为chat-who:consultId,value为对象标识,比如这里就是医生和患者,医生用D标识,患者用P标识;另一个key是表示回合数,声明为chat-num:consultId,value就是当前回合数。这里的consultId是动态的,表示这个咨询的id,可以根据自己的业务来定;
2)、这两个key的过期时间我们都定为2天,具体过期时间要根据自己业务规则来适配;
3)、我们在特定的位置进行初始化,只要是进入聊天之前都可以,比如这里的场景,就是患者发起咨询成功后才开始聊天,我们就在发起成功后的方法中初始化聊天回合数为默认值6个回合,这个默认值还可以做成配置的形式进行动态读取的;
4)、我们在发消息的方法中做一个判断,获取redis中的chat-who:consultId,看是否存在,存在就往下执行,不存在就说明发的是