需求:
1、使用微博数据提供数据查询接口,通过微博编号查询微博,将热门数据缓存到redis中
基于Spring的网页端口查询,MVC分层构架
数据库数据
1001 【#蛇头将孩子扔过美墨边境墙#】最近一段时间以来,不断有非法移民前往美墨边境,试图闯关入境美国。而这背后反映出的是“蛇头”贩卖人口活动的猖獗,“蛇头”指的是那些帮助他人非法越境,并从中牟利的人。美国政府3月31日公布的一段画面显示,一名“蛇头”直接爬上边境墙,把两个孩子扔到了美国一侧
1002 #扫黑纪录片看傻了#把纪录片看完惊掉下巴,人民的名义第二部素材有了
1003 #扫黑纪录片看傻了#3月30日,大型政论专题片《扫黑除恶-为了国泰民安》:杨氏家族涉黑涉恶,控制哈尔滨呼兰区公交、供暖等20多年 L吖吖视频yxh的微博视频
1004 #扫黑纪录片看傻了#还有一点东北年轻人真的得改下了,不要一上网就发纹身,大金链子,喝酒,抽烟,骂人,装大哥大姐头,老铁666。特别是拍视频,我都不想说了,装弱智的,奇葩的事儿,大红大绿花棉沃衣服,真的影响东北的形象,让全国年轻人对东北人的印象只有一个,俗到爆表,土到巅峰
1005 【#北京公积金个人贷款新增告知承诺制#,无需再开相关证明】记者1日从北京住房公积金管理中心获悉,贷款申请过程中对于需要提供异地贷款职工住房公积金缴存使用证明或原缴存地公积金中心开具的缴存证明的借款申请人,在保留原有办理方式的基础上新增加证明告知承诺制,承诺后无需再开具相关证明。
1006 【#北京公积金个人贷款新增告知承诺制#,无需再开相关证明】
据北京住房公积金管理中心,为进一步贯彻落实“减证便民”决策部署,深化“放管服”改革,贷款申请过程中对于需要提供异地贷款职工住房公积金缴存使用证明或原缴存地公积金中心开具的缴存证明的借款申请人,在保留原有办理方式的基础上新增加证明告知承诺制,承诺后无需再开具相关证明。 (北京日报)
1007 #北京公积金个人贷款新增告知承诺制#听说,今年很多大城市的售楼部,又开始对想用组合贷的人翻白眼了。
Java分层构架
分析:代码中用到连接池的方式连接,用这种连接方式的好处是服务器中断后恢复,可以从连接池中重新建立连接,继续程序的运转。对数据查询进行优化,设置了缓存数据库,缓存数据库Redis存放热门信息,在第二次查询时,速度明显变快。
1.创建一个类来存储信息对象
import lombok.*;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Weibo_infor {
private Integer id;
private String infor;
}
2.创建控制层类 Weibo_Contraller
package com.contraler;
import com.bean.Weibo_infor;
import com.service.Weibo_Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Weibo_Contraller {
private Weibo_Service service=new Weibo_Service();
@GetMapping("/QueryInfor")
public Weibo_infor QueryInfor(String id){
Weibo_infor infor = service.queryInforById(id);
return infor;
}
}
3.创建类Weibo_Service Service层
package com.service;
import com.bean.Weibo_infor;
import com.dao.Weibo_Dao;
import com.redis.JedisUtil;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;
public class Weibo_Service {
private Weibo_Dao dao=new Weibo_Dao();
public Weibo_infor queryInforById(String id){
//如果缓冲有
String key="hotwords" +id;
Jedis jedis=null;
try{
jedis = JedisUtil.getConn();
Map<String, String> map = jedis.hgetAll(key);
if (map!=null&& !map.isEmpty()){
Weibo_infor infor = new Weibo_infor();
infor.setId(Integer.parseInt(id));
infor.setInfor(map.get(id));
// System.out.println(infor);
//更新过期时间
jedis.expire(key,10);
return infor;
}
}catch (Exception e){
System.out.println("缓存读取失败");
}finally {
if (jedis!=null) {
jedis.close();
}
}
//缓存没有,从数据库中读取
Weibo_infor weibo_infor = dao.queryInforById(id);
System.out.println(weibo_infor);
if (weibo_infor==null){
return null;
}
//存入缓存数据库中
try{
jedis = JedisUtil.getConn();
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put(id,weibo_infor.getInfor());
jedis.hset(key,hashMap);
jedis.expire(key,10);
return weibo_infor;
}catch (Exception e){
System.out.println("写入失败");
}finally {
if(jedis!=null){
jedis.close();
}
}
return weibo_infor;
}
}
4.调用数据库数据Weibo_Dao 数据库持久层
package com.dao;
import com.bean.Weibo_infor;
import com.shujia.util.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Weibo_Dao {
Weibo_infor infor=null;
public Weibo_infor queryInforById(String id){
Connection conn = JDBCUtil.getConn();
try {
PreparedStatement ps = conn.prepareStatement("select * from t_weibo where id=?");
ps.setString(1,id);
ResultSet rs = ps.executeQuery();
if (rs.next()){
int id1 = rs.getInt(1);
String info = rs.getString(2);
infor=new Weibo_infor(id1,info);
return infor;
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return infor;
}
}
5.在间接过程中所用到的工具类Util
5.1JDBCUtil类
package com.shujia.util;
import org.apache.commons.dbcp2.BasicDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class JDBCUtil {
private static BasicDataSource dataSource;
private static Connection con;
static {
dataSource=new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://node1:3306/shujia");
dataSource.setUsername("root");
dataSource.setPassword("123456");
dataSource.setInitialSize(2);
dataSource.setMaxIdle(10);
}
public static Connection getConn(){
try {
con = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
}
5.2缓存数据库Redis工具类
package com.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisUtil {
static JedisPool jedisPool;
static {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(10);
jedisPoolConfig.setMinIdle(2);
jedisPoolConfig.setMaxWaitMillis(100);
jedisPool=new JedisPool("master",6379);
}
public static Jedis getConn(){
return jedisPool.getResource();
}
}
6.启动Springboot
第一次查询数据时间为831ms,第二次查询将直接从缓存数据库Redis中查询
将查询时间缩短到8ms,极快的提高查询效率,Redis数据库为内存数据库存放数据量小,因此适合做热点信息的查询。