小体量系统,某些特定场景需要做异步处理。如操作日志记录、发送消息、数据excel导入等。并发量不大,主要作用是异步批处理数据,提高响应速度,改善用户体验,不至于页面卡半天。用消息队列的话显得很笨重,牛刀杀鸡,不利于项目的快速布署和影响项目稳定。在这种懒思想的加持下,打起了已有的redis的主意。现成的。小范围使用。很合喂口。使用示例:
配置频道:
@Bean
@DependsOn("zyRedisUtils")
public RedisMessageListenerContainer redisMessageListenerContainer(List<LocalMessageListener> listeners,
RedisConnectionFactory connectionFactory
) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
if (null != listeners && listeners.size() > 0) {
container.setConnectionFactory(connectionFactory);
for (LocalMessageListener listener : listeners) {
container.addMessageListener(listener, new ChannelTopic(listener.getChannelKey()));
}
}
return container;
}
LocalMessageListener :
public interface LocalMessageListener extends MessageListener {
String channelKey();
default String getChannelKey() {
return ZYRedisUtils.wrapperKey(channelKey());
}
}
记录操作日志示例:
// RequestLogHandler封装自日志切面。
public class RequestLogRecordProcessor implements RequestLogHandler, LocalMessageListener {
public final static String LOGGING_CHANNEL = "system_visit_logging";
@Autowired
private RequestLogMapper requestLogMapper;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private LoggingDynamicTableSupport loggingDynamicTableSupport;
// 请求日志
@Override
public void handleRequestLog(ProceedingJoinPoint jp, HttpServletRequest request, RequestLog requestLog) {
// 发布消息
stringRedisTemplate.convertAndSend(this.getChannelKey(), JSONObject.toJSONString(requestLog));
}
@Override
public String channelKey() {
// 定义频道
return LOGGING_CHANNEL;
}
@Override
public void onMessage(Message message, byte[] pattern) {
byte[] messageBody = message.getBody();
Object msg = stringRedisTemplate.getValueSerializer().deserialize(messageBody);
if (ZYStrUtils.isNull(msg)) {
return;
}
String logJson = String.valueOf(msg);
// 反系列化对象
RequestLog requestLog = JSONObject.parseObject(logJson, RequestLog.class);
// 创建动态表
String tableSuffix = loggingDynamicTableSupport.try2CreateRequestLogTable();
// 表前缀
requestLog .setTableSuffix(tableSuffix);
// 保存日志
requestLogMapper.insert(requestLog );
}
}
延时队列的实现:
消息提醒需要用到延时队列,实现方法:
配置一个key失效的监听听器,发送延时队列时,先写一个带延时长时的前缀key,待其失效后,将key所对应的消息放入队列中。实现一个简单的延时效果。文章来源:https://www.toymoban.com/news/detail-510483.html
@Bean
@ConditionalOnBean(RedisMessageListenerContainer.class)
public KeyExpirationEventMessageListener localKeyExpirationEventMessageListener(RedisMessageListenerContainer container) {
return new KeyExpirationListener(container);
}
实际中,运转还算良好。单体系统,简单快乐就好。随便玩玩。文章来源地址https://www.toymoban.com/news/detail-510483.html
到了这里,关于redis发布订阅模式的应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!