原理:利用redis的List來做FIFO雙向鏈表,向同一個信息list中存取元素的過程,遵循先進先出原則,redis只支持單消費者。 redis配置請百度,直接上代碼:
1、消息生產者
import com.fbank.dis_common.message.dis.DisResult; import org.apache.commons.collections.CollectionUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.Collection; import java.util.Iterator; import java.util.Map; @RestController public class RedisMqProducter { @Resource(name = "redisTemplate") RedisTemplate redis; @RequestMapping("/redis/mq/product") public Map redisMqProduct(@RequestBody Map<String, String> map) { Collection<String> values = map.values(); if (CollectionUtils.isNotEmpty(values)) { Iterator<String> iterator = values.iterator(); while (iterator.hasNext()) { String str = iterator.next(); Long size = redis.opsForList().rightPush("redisMqList", str);//從右向list添加元素 System.out.println("向[redisMqList]中推送信息 = [" + str + "], 消息總數爲[" + size + "]條"); } } return DisResult.success(); } }
2、消息消費者
import org.apache.commons.lang.StringUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; @Component public class RedisMqListener { @Resource(name = "redisTemplate") RedisTemplate redis; /** * 利用redis的List來做FIFO雙向鏈表,實現一個輕量級的高性能消息隊列服務 */ @Scheduled(cron = "0/10 * * * * ?") public void execute() { //遵循先進先出的原則,右進左出 or 左進右出 String obj = (String) redis.opsForList().leftPop("redisMqList"); System.out.println("從redisMqList中獲取到的消息爲 = [" + (StringUtils.isBlank(obj) ? "" : obj) + "]"); } }
3、執行結果