背景:
项目业务上需要实现延时发送消息的需求。最开始想到的就是消息中间件,公司统一用的RocketMq,于是开始整。。。但是,业务需求要求的延时消息时间是可自由指定的,但是公司居然用的是开源的RocketMq,开源的只支持18个固定级别的延时,
我们这里不重点说RocketMq,有兴趣的自己查吧。结论就是开源的RocketMq没法实现现在的需求,要不就用阿里云的,公司也不愿出那份钱吧。哈哈哈。于是想别的方法。
办法二。那就只能定时轮询配合实现了,查数据库的话,会增加数据库的压力,效率也不好。于是使用Redis配合定时实现延时消费。
Redis实现代码
使用zSet数据结构
生产者代码:
//key:redis,zSet集合key
//msg:key的value值,存储消息对象
//execTime:执行时间,时间戳
public void producerRedisDelayMsg(String key, Object msg, longexecTime) {
redisService.zSetAdd(key, msg, execTime);
}
调用的zSetAdd方法实际就是对redis的操作,重点就是时间戳为score这个值,集合就是通过这个值进行排序的
public boolean zSetAdd(String key, Object value, longscore) {booleanre;try{
re=redisTemplate.opsForZSet().add(key, va