redis本身就带有发送接收的功能,用redis来发送接收的方法如下:
1.redis侦听的方法
2.redis发送信息的方法
3.刚才1中的画面中应该能看到如下内容
从以上看来redis-cli带有发送接收信息的功能,但是用spring-data-redis如何来实现呢,其实比较简单,可以有两个方法,一个方法通过实现MessageListener接口类实现,但是他有一个问题,在侦听信息需要借助于redisconnectfactory的connection来进行,且是阻塞模式下的,可以借助线程的方式来进行,方法如下:
1.在yml文件增加以下内容,主是为了设定redis的topic
redis.msg.test.chanel: msgchanel
2.建里listener的Bean,且以线程的方式来启动
@Component
public class ReciveMsgListener extends Thread implements MessageListener {
@Autowired
private Environment env;
private RedisTemplate redisTemplate;
private String chanel;
public ReciveMsgListener(@Autowired RedisTemplate redisTemplate) {
this.redisTemplate=redisTemplate;
this.start();
}
@Override
public void onMessage(Message message, byte[] pattern) {
// TODO Auto-generated method stub
System.out.println("on Message");
byte[] msgBody= message.getBody();
System.out.println(" recive "+msgBody==null?"empty":new String(msgBody));
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
System.out.println("on listen "+this.chanel);
redisTemplate.getConnectionFactory().getClusterConnection().subscribe(this, env.getProperty("redis.msg.test.chanel").getBytes());
}
}
}
3.在某个controller类增加如下内容,主要借助redistemplate.convertadnsend方法来进行
@Autowired
private RedisTemplate redisTemplate
@RequestMapping("/redis/publish/{msg}")
public String sendmsg(@PathVariable String msg) {
//(new Thread(this.listenMsg)).start();
this.redisTemplate.convertAndSend(env.getProperty("redis.msg.test.chanel"), msg);
//listenMsg.recieMsg();
return "success";
}
但是你也可以借于redisconnectfactory的connection来进行,不是通过二进度的方式来进行
byte[] msg = ...
byte[] channel = ...
con.publish(msg, channel);
4.可以ie中输入http://localhost:9001//redis/publish/hello ni hao 后,你可以在日志中看到如下内容
从以上方法看起来比较麻烦需要借助于线程的方法来进行,其实spring提供了另外一种方式,主要是RedisMessageListenerContainer类,方法如下:
@Bean
public RedisMessageListenerContainer redisMsgListenContainer(@Autowired ReciveMsgListener listener,@Autowired RedisConnectionFactory connectFactory) {
RedisMessageListenerContainer container=new RedisMessageListenerContainer();
Topic topic=new ChannelTopic(env.getProperty("redis.msg.test.chanel"));//生成topic
container.addMessageListener(listener, topic);//设定listener和topic
container.setConnectionFactory(connectFactory);//设定redisfactory
return container;
}
这里的redisconnectionfactory bean的实现如下,请参考
@Bean
public RedisConnectionFactory connectionFactory(@Autowired RedisNodeConfig redisConfig) {
JedisConnectionFactory redisFactory= new JedisConnectionFactory(
new RedisClusterConfiguration(redisConfig.getNodes()));
return redisFactory;
}
@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class RedisNodeConfig {
private List<String> nodes;
public List<String> getNodes() {
return nodes;
}
public void setNodes(List<String> nodes) {
this.nodes = nodes;
}
}
以上内容中spring.redis.cluster需要在yml增加主要是redis的cluster的信息
spring:
redis:
cluster:
nodes:
- 127.0.0.1:7000
- 127.0.0.1:7001
- 127.0.0.1:7002
- 127.0.0.1:7003
- 127.0.0.1:7004
- 127.0.0.1:7005
然在ie中http://localhost:9001//redis/publish/hello ni hao 你会看到两个都能信息