一、概述

最近在做性能优化,之前有一个业务是这样实现的:

1.温度报警后第三方通讯管理机直接把报警信息保存到数据库;

2.我们在数据库中添加触发器,(BEFORE INSERT)根据这条报警信息处理业务逻辑,在数据库中插入“其他业务数据”;

3.前端setTimeout每隔5秒ajax去后端查询“其他业务数据”(查库);

优化后这样实现:

两个微服务,消息中间件专门一个服务,接收消息存入数据库,存入redis;业务服务直接从redis获取;

1.MQTT订阅通讯管理机报警事件主题;

2.发生报警后,java中根据报警信息保存“其他业务数据”到数据库并放入redis缓存;

3.前端setTimeout每隔5秒ajax去后端查询“其他业务数据”(改为从redis中获取);

4.下一步计划使用WebSocekt,去掉前端setTimeout;

二、使用StringRedisTemplate、RedisTemplate<String, Object>
进一步分析发现使用@Cacheable有问题,消息中间件收到第二条报警消息,如果业务系统没有处理第一条报警消息(redis中未删除,同样的key redis中已有一条)则redis中的信息不会更新。

应该是:消息中间件每次接收消息,处理后都往redis中更新

使用RedisTemplate<String, Object>直接保存List对象,redis存储中会携带一个类路径信息("com.es.xx.evralarm.EvrAlarm"),

业务服务获取的时候无法解析(两个实体类内容相同,类路径不同),只能使用StringRedisTemplate了,只能是在redis存取前后自己手动对象转json。

使用Gson直接把要保存的List<>对象转成json再保存到redis。

中间件所在服务存入redis:

package com.xx.service.evralarm;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import com.es.entity.evralarm.EvrAlarm;
import com.es.repository.evralarm.EvrAlarmDao;
import com.google.gson.Gson;

@Service
public class EvrAlarmCacheService {

@Autowired
private EvrAlarmDao evrAlarmDao;

@Autowired
private StringRedisTemplate redisTemplate;

public List<EvrAlarm> getEvrAlarmByAccountId(String accountId){
Map<String,Object> params = new HashMap<>();
params.put("accountId", accountId);
params.put("limit", 1);
List<EvrAlarm> evrAlarms = evrAlarmDao.selectEvrAlarmByAccount(params);

//redis缓存
ValueOperations<String,String> vo = redisTemplate.opsForValue();
Gson gson = new Gson();
vo.set("EvrAlarm-"+accountId, gson.toJson(evrAlarms));
return evrAlarms;
}
}
业务服务从redis中取:
从redis中获取key对应的value,得到string类型的value,使用Gson转成List<>对象

/**

* 根据账户ID查询最新告警信息

* */

public List<EvrAlarm> selectEvrAlarmByAccount(String accountId){
//redis缓存中获取
ValueOperations<String,String> vo = redisTemplate.opsForValue();
String value = vo.get("EvrAlarm-"+accountId);
Gson gson = new Gson();
List<EvrAlarm> evrAlarms = gson.fromJson(value, List.class);
return evrAlarms == null ? new ArrayList<>() : evrAlarms;
}

业务操作删除、同时删除redis:

public void deleteAccountEvralarm(String accountId, String evrAlarmId){
Map<String, Object> queryMap = new HashMap<>();
queryMap.put("accountId", accountId);
queryMap.put("evrAlarmId", evrAlarmId);
accountEvralarmDao.deleteByPrimaryKey(queryMap);
//redis删除缓存
redisTemplate.delete("EvrAlarm-"+accountId);
}

最新文章

  1. 关于Spring/Hibernate 3.x升级4.x的小问题
  2. 第一次链接Azure,固定实例内部IP(DIP)
  3. Linux VFS Extended Attribute And Access Control Table
  4. Nginx模块之————RTMP模块在Ubuntu上以串流直播HLS视频
  5. MatLab 组件大全
  6. 对于python,一切事物都是对象,对象基于类创建
  7. JavaScript 之 弹出窗口总结
  8. csu 1303 Decimal (数论题)
  9. Python 基础【第九篇】运算
  10. Chart图形 [功能帮助类] Assistant创建显示图像的标签和文件 (转载)
  11. MBG 相关资源链接
  12. C++中vector 容器的基本操作
  13. idea中的汉语注释出现乱码的解决方案
  14. socket编程--相关函数--sendto();read();
  15. GIT入门笔记(20)- git 开发提交代码过程梳理
  16. JavaScript数据结构与算法(一) 栈的实现
  17. &quot;INSTALL_FAILED_DUPLICATE_PERMISSION &quot;错误解决
  18. Luogu P4643 【模板】动态dp(矩阵乘法,线段树,树链剖分)
  19. Photoshop CS6打开图片后看不到怎么办
  20. xorm中的几个坑

热门文章

  1. Linux按照时间顺序列出文件
  2. pycharm远程服务器进行调试
  3. QT学习相关
  4. centos6安装opencv2
  5. [Codeforces Round #526 (Div. 2)]
  6. 【java多线程】队列系统之LinkedBlockingQueue源码
  7. LG3975 [TJOI2015]弦论
  8. C#获取IIS所有站点及虚拟目录和应用程序(包含名称及详细信息)
  9. itcast-ssh-crm实践
  10. Scala中的Map使用例子