敏感词过滤,一个很经典的需求场景,目前我要对一个每天上千万消息的聊天系统做敏感词过滤优化,之前的解决方案是,每次从redis中取出敏感词集合,然后做遍历操作,使用indexOf查看是否出现在聊天消息中,鉴于消息的高频转发,所以每次从redis中读取敏感词库方案已经不太适用该场景,经过调研和请教有以下两个解决方案可够参考: 1、将redis中的敏感词库在服务启动时,加载到内存中,后续逻辑不变; 2、同样将敏感词库读到内存,不同之处在于使用bloom-filter算法,将敏感词打散到内存位数组中,每次将消息放进去看是否匹配到; 优劣分析:方案一可以节约redis读取的耗时,提高每次的处理效率,但是鉴于node单个进程珍贵的1.4G内存,如果敏感词库很大的情况下,不太适用;方案2在方案1的基础上,不仅提高了处理效率,同时大大减少了内存消耗,但缺点很明显,如果聊天消息中包含敏感词之外其他的内容,将对结果造成很大程度的误判; 综上,目前我比较偏向于方案2,如果有更好的方案,请大家积极分享;毕竟作为一个经典需求场景应该会有很多人遇到,希望能够帮助到大家;
↧