有一张 200W 数据量的会员表,每个会员会有长短不一的到期时间,现在想在快到期之前发送邮件通知提醒续费,
这个问题里面有几个关键词:
- 200W 数据意味着数据量比较大
- 每个会员都有过期时间,需要能够筛选出快过期的会员
关于这个问题,可以有几种种解决方案:
系统不主动轮询
第一种,系统不主动轮询,而是等用户登录到系统以后,触发一次检查。如果发现会员的过期时间小于设定的阈值,就触发一次弹窗和邮件提醒。这种方式规避了轮询问题,不会对数据库和后端应用程序造成任何压力。缺点是,如果用户一直不登陆,就一直无法实现会员过期,并且也无法提前去根据运营策略发送续期的提醒消息。
搜索引擎
第二种,我们可以使用搜索引擎,比如 Solr、或者 Elasticsearch。把会员表里面的会员 id 和会员到期时间存储一份到搜索引擎中。搜索引擎的优势在于大数据量的快速检索,并且具有高可扩展性和高可靠性,非常适合大规模数据的处理。
Redis
第三种,可以使用 Redis 来实现。用户开通会员以后,在 Redis 里面存储这个会员 id,以及设置这个 id 的过期时间。然后可以使用 redis 的过期提醒功能,
把配置项 notify-keyspace-events 改为 notify-keyspace-events "Ex",当 Redis 里面的 key 过期以后,会触发一个 key 过期事件,我们可以在应用程序中监听这个事件来处理。
MQ
第四种,可以直接使用 MQ 提供的延迟队列,当用户开通会员以后,直接计算这个会员的过期时间,然后发送一个延迟消息到 MQ 上,一旦消息达到过期时间,消费者就可以消费这个消息来触发会员过期的提醒。