业务场景:

调用微信三方接口进行图片/视频安全校验,由于微信的视频/图片校验结果是异步返回到服务端的接口,所以需要将附有照片或者视频的说说审核通过之后再将说说发布到论坛中。

问题分析:

1、如何标识所有图片/视频审核完成之后再发布呢?

因为每次向微信的接口发送请求的时候,会对每张照片的审核都会有一个任务id(trace_id),根据这个traceid映射对应的is_valid(标识是否校验通过)和talkbid(说说的主键id)字段来标识

  1. 单独拉一张表出来存储图片url和trace_id的关系,然后用一个is_valid字段根据微信接口异步返回的结果标识判断是否校验通过,如果校验通过is_valid就变成1,还在校验过程中或者校验未通过就标识0。
  2. 使用Redis通过设置超时时间来使标识自动淘汰,释放内存空间
  3. 在说说表添加一个trace_id字段,存储每张照片的trace_id,并用逗号分隔开,每次微信异步返回结果之后如果审核通过就把trace_id和返回过来的trace_id部分删除,否则就不删除,同时判断此时trace_id字段是否为空,如果等于空值了,那么就说明全部校验通过了、然后将说说详情中的is_delete(说说软删标识)字段设为0,展示到社区论坛中。

3、以上标识方法会有什么问题呢?为什么最终选用对说说详情表添加字段的方式进行标识呢?

第一种方法,需要单独创建一个表,会占用一定的磁盘空间,以及MySQL需要花费更大的空间进行维护造成一定的资源浪费。

第二种方法,Redis是基于内存的一种缓存数据库,如果当有大量的io操作的时候,就会占用内存空间,这个时候很可能会出现Redis崩盘的情况,甚至说Redis宕机,因为微布校园现在是单体架构,暂时无解,只能放弃这个想法了。

第三种方法,毕竟只是添加一个字段,MySQL的维护成本相对第一种就比较低了,对于第二种方案,数据的读取,MySQL 通常会使用缓冲池(Buffer Pool)来管理数据在内存中的存储。数据会根据需要从磁盘加载到缓冲池中,并且在查询时尽量从缓冲池中读取数据,从而避免频繁的磁盘 I/O 操作。如果数据在缓冲池中已经存在,查询时可以直接从内存中读取,这比从磁盘读取要快得多。反正在读取的时候,要用缓冲池的机制将数据放到内存中,再从缓冲池中读取数据,这样相对单独用Redis去维护标识会好很多。