Contents
  1. 1. 参考资料
  2. 2. 实现原理
  3. 3. 相关代码

参考资料

redis 5种数据结构和相关命令
https://www.cnblogs.com/Cwj-XFH/p/6938799.html

消息队列含源码的博客
https://blog.csdn.net/noaman_wgs/article/details/73194700#commentBox

消息订阅模式博客
https://blog.csdn.net/jslcylcy/article/details/78201812

实现原理

  • 有序性:redis的List内部原理是双向列表类似LinkedList,支持丰富的双向操作
  • 原子性:redis读取的原子性,实现消息不会被消费者重复消费的功能,lpop
  • 可靠性:redis的持久化和高可用性
  • 即时性:每个消费者开启一个线程,无线循环尝试读取特定节点下面的消息
  • 序列化:把传输对象序列化,再提取出来
  • 同时支持发布订阅模式:PUBLISH talk ‘test’\SUBSCRIBE talk

相关代码

public void push(String value ){
jedisAdapter.lpush(QUEUE_NAME, value);
}
public List<String> pop(){
return jedisAdapter.brpop(0,QUEUE_NAME);
}
public void sendMessage(String channel, String message) {
redisTemplate.convertAndSend(channel, message);
}
@Component
public class RedisMessageListener implements MessageListener {
@Autowired
private RedisTemplate<String, String> redisTemplate;
private static Logger logger = Logger.getLogger(RedisMessageListener.class);
@Override
public void onMessage(Message message, byte[] pattern) {
byte[] body = message.getBody();// 请使用valueSerializer
byte[] channel = message.getChannel();
// 请参考配置文件,本例中key,value的序列化方式均为string。
// 其中key必须为stringSerializer。和redisTemplate.convertAndSend对应
String msgContent = (String) redisTemplate.getValueSerializer().deserialize(body);
String topic = (String) redisTemplate.getStringSerializer().deserialize(channel);
logger.info("redis--topic:" + topic + " body:" + msgContent);
}
}
Contents
  1. 1. 参考资料
  2. 2. 实现原理
  3. 3. 相关代码