您好,登錄后才能下訂單哦!
這篇文章主要講解了“Redis中PUB/SUB模式是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Redis中PUB/SUB模式是什么”吧!
redis和rabbitMQ發布訂閱功能的區別:
redis發布訂閱是廣播模式的,redis發布一條message,所有消費者都可以進行消費,而rabbitMQ隊列方式的,發布一條message可以通知所有訂閱者,但是這能有一個訂閱者消費message。
redis消息不會緩存,當redis發布消息之后沒有消費者消費也會消失,而rabbitMQ發布消息之后不被消費就會一直存在。
redis消息可以是持久化的(取決于redis持久化方式和用戶邏輯),rabbitMQ消息消費之后就會消失。
redis可以設置發布消息的key和action(稍后介紹)。
在分布式環境下,redis可以為所有動態創建的實例節點發布消息。
redis發布/訂閱應用場景:
分布式環境下的配置中心配置改變,通知所有實例節點刷新配置。
多數據庫環境下數據的改變,通知所有數據庫同步數據。
第三方對接一對多場景,一次性廣播通知所有第三方服務。
……
redis配置開啟發布/訂閱功能:
redis發布/訂閱配置notify-keyspace-events的詳細配置見redis的配置文件里面,
創建springboot web項目,并添加RedisMsgPubSubListener監聽器:
import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @Slf4j @Component public class RedisMsgPubSubListener implements MessageListener { @Autowired private RedisTemplate redisTemplate; @Override public void onMessage(Message message, byte[] pattern) { System.out.println("監聽到redis中YCYC數據變化:"+redisTemplate.opsForHash().values("YCYC")); } }
添加redis配置,裝在監聽器:
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.yc.web.base.interceptor.RedisMsgPubSubListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.listener.PatternTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); //使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值 Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(mapper); template.setValueSerializer(serializer); //使用StringRedisSerializer來序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); template.afterPropertiesSet(); return template; } @Bean public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); // container.addMessageListener(listenerAdapter, new PatternTopic("__keyevent@*:hset")); container.addMessageListener(listenerAdapter, new PatternTopic("__keyspace@*:YCYC")); return container; } @Bean public MessageListenerAdapter listenerAdapter(RedisMsgPubSubListener receiver) { return new MessageListenerAdapter(receiver); } }
添加測試Controller:
import com.yc.web.base.annotations.NoRepeatSubmit; import com.yc.web.base.config.ResultInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @Slf4j @Api(description = "redis") @RestController @RequestMapping("/redis") public class RedisController { @Autowired private RedisTemplate redisTemplate; @ApiOperation(response = ResultInfo.class, value = "setRedis", notes = "setRedis") @GetMapping(value = "/setRedis") @NoRepeatSubmit public ResultInfo setRedis() throws Exception { // redisTemplate.opsForValue().set("YCYC", "YC_chat"); redisTemplate.opsForHash().put("YCYC", "YC1", System.currentTimeMillis()); redisTemplate.opsForHash().put("YCYC", "YC2", System.currentTimeMillis()); // redisTemplate.convertAndSend("YCYC","YC_chat"); System.out.println("添加成功"); return ResultInfo.Success(); } }
啟動項目測試,在Controller里向redis里設置hash格式數據,在RedisMsgPubSubListener就會監聽到redis中的數據變化:
添加成功 監聽到redis中YCYC數據變化:[1571367514510, 1571367514524] 監聽到redis中YCYC數據變化:[1571367514510, 1571367514524]
感謝各位的閱讀,以上就是“Redis中PUB/SUB模式是什么”的內容了,經過本文的學習后,相信大家對Redis中PUB/SUB模式是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。