@Configuration
public class RedisConfig {
@Bean
RedisMessageListenerContainer container (RedisConnectionFactory redisConnectionFactory, MessageListenerAdapter listenerAdapter){
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(redisConnectionFactory);
// 可以添加多个 messageListener,配置不同的交换机
container.addMessageListener(listenerAdapter,new PatternTopic("msg"));
return container;
}
//消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
@Bean
MessageListenerAdapter listenerAdapter(RedisReceiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<String, Object> template = new RedisTemplate();
//连接工厂
template.setConnectionFactory(redisConnectionFactory);
//序列化配置
Jackson2JsonRedisSerializer objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectJackson2JsonRedisSerializer.setObjectMapper(objectMapper);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//配置具体序列化
//key采用string的序列化方式
template.setKeySerializer(stringRedisSerializer);
//hash的key采用string的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
//value序列化采用jackson
template.setValueSerializer(objectJackson2JsonRedisSerializer);
//hash的value序列化采用jackson
template.setHashValueSerializer(objectJackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
上面这段代码是用注解的形式redis与springboot整合
@Component
public class MessageSend implements ApplicationContextAware {
private RedisTemplate redisTemplate;
private String lock_perfix = "lock";
@Scheduled(fixedDelay = 1000)
public void sendMessage(){
((MessageSend)(AopContext.currentProxy())).thods(lock_perfix,redisTemplate );
}
@DistributedLock(leaseTime = 7L, argNum = 1,waitTime = 5l)
public void thods(String lock_perfix,RedisTemplate redisTemplate) {
try {
Thread.sleep(5000);
redisTemplate.convertAndSend("msg",String.valueOf(Math.random()));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=======");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.redisTemplate = (RedisTemplate) applicationContext.getBean("redisTemplate");
}
}
这段代码是一个发布代码
@DistributedLock(leaseTime = 7L, argNum = 1,waitTime = 5l)这个注解你们不用写,也不用实现ApplicationContextAware ,直接删除
@Component
public class RedisReceiver {
private String lock_perfix = "lock";
public void receiveMessage(String message, String lock_perfix) {
System.out.println("=====================>" + message);
}
}
这个代码是 订阅的代码
配置类application.properties
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
#spring.redis.password=******
server.port=5555