Spring AOP与Redis搭建缓存(2)

public class TestDao { //查询 public RiskNote getByApplId(Integer applId) throws Exception{ Class.forName("Oracle.jdbc.driver.OracleDriver"); Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@192.168.11.215:1521:MFTEST01", "datacenter", "datacenter"); PreparedStatement statement = connection.prepareStatement("select * from TEMP_RISK_NOTE where appl_id=?"); //执行 statement.setInt(1, applId); ResultSet resultSet = statement.executeQuery(); RiskNote riskNote = new RiskNote(); //解析 while (resultSet.next()) { riskNote.setApplId(resultSet.getInt("APPL_ID")); riskNote.setAllqyorg3monNum(resultSet.getInt("ALLQYORG3MON_NUM")); riskNote.setLoanF6endAmt(resultSet.getDouble("LOAN_F6END_AMT")); riskNote.setIsHighRisk1(resultSet.getString("IS_HIGH_RISK_1")); riskNote.setCreateDate(resultSet.getDate("CREATE_DATE")); riskNote.setRisk1Detail(resultSet.getString("RISK1_DETAIL")); riskNote.setRisk2(resultSet.getInt("RISK2")); riskNote.setRisk3(resultSet.getString("RISK3")); riskNote.setCreditpaymonth(resultSet.getString("CREDITPAYMONTH")); } return riskNote; } } 

Service层调用DAO:

@Service public class TestService { @Autowired private TestDao testDao; public Object get(Integer applId) throws Exception{ RiskNote riskNote = testDao.getByApplId(applId); return riskNote; } } 

测试:

public class TestQueryRiskNote { @Test public void testQuery() throws Exception{ ApplicationContext ac = new FileSystemXmlApplicationContext("src/main/resources/spring/applicationContext_redis.xml"); TestService testService = (TestService) ac.getBean("testService"); RiskNote riskNote = (RiskNote)testService.get(91193); System.out.println(riskNote); } }

此时测试代码输出的是查询到的RiskNote对象,可以重写toString方法查看

结果如下:最后输出的对象

Spring AOP与Redis搭建缓存

在虚拟机Linux系统上搭建Redis,具体教程请自行百度

redis支持多种数据结构,查询的对象可以直接使用hash结构存入redis。

因为项目中各个方法查询的数据不一致,比如有简单对象,有List集合,有Map集合,List中套Map套对象等复杂结构,为了实现统一性和通用性,redis中也刚好提供了set(byte[],byte[])方法,所以可以将对象序列化后存入redis,取出后反序列化为对象。

序列化与反序列化工具类:

/** * * @Description: 序列化反序列化工具 */ public class SerializeUtil { /** * * 序列化 */ public static byte[] serialize(Object obj){ ObjectOutputStream oos = null; ByteArrayOutputStream baos = null; try { //序列化 baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(obj); byte[] byteArray = baos.toByteArray(); return byteArray; } catch (IOException e) { e.printStackTrace(); } return null; } /** * * 反序列化 * @param bytes * @return */ public static Object unSerialize(byte[] bytes){ ByteArrayInputStream bais = null; try { //反序列化为对象 bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } catch (Exception e) { e.printStackTrace(); } return null; } }

切面分析:

切面:查询前先查询redis,如果查询不到穿透到数据库,从数据库查询到数据后,保存到redis,然后下次查询可直接命中缓存

目标方法是查询数据库,查询之前需要查询redis,这是前置

假设从redis中没有查到,则查询数据库,执行完目标方法后,需要将查询的数据放到redis以便下次查询时不需要再到数据库中查,这是后置

所以,可以将切面中的通知定为环绕通知

切面类编写如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14617.html