1.使用Jedis技术
1)redis的意义
redis是当今基本所有互联网产品都在使用的一种提供键值对形式的内存数据库(非关系型数据库)。之所以说是内存数据库,是因为redis基于内存的读取和写入相比传统的数据库基于磁盘IO快上数倍。于是乎redis在现在的应用中使用的非常广泛。主要的作用在于,提供缓存服务,存储访问频率高的热数据防止穿透到数据库。
2)Jedis是什么;
Jedis是java的redis客户端,用来操作redis数据库。
3)应用在这里;
此项目中,分类条目的数据从数据库中来,却又是长期不变的数据,每次访问都要查询数据库非常消耗资源,故而在此处采用redis来优化,减少资源消耗。
2.代码实现
2.1. Servlet层代码
1)findAll()方法;
//声明service层的业务对象
private CategoryService service = new CategoryServiceImpl();
public void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.调用service
List cs = service.findAll();
//2.序列化json并响应给客户端
writeValue(cs,response);
}
2.2. service层代码
1)提供findAll()方法;
CategoryDao categoryDao = new CategoryDaoImpl();
@Override
public List findAll() {
//1.从redis中查询
//1.1获取jedis客户端
Jedis jedis = JedisUtil.getJedis();
//1.2可使用sortedset排序查询
Set categorys = jedis.zrangeWithScores("category", 0, -1);
List cs = null;
//2.判断查询集合是否为空
if(categorys==null || categorys.size()==0){
//3.若为空,则从数据库中查询,存到redis中
cs = categoryDao.findAll();
for (int i = 0; i < cs.size(); i++) {
jedis.zadd("category",cs.get(i).getCid(),cs.get(i).getCname());
}
}else{
//4.若不为空,则将set数据存到list
cs = new ArrayList();
for (Tuple tuple: categorys) {
Category category = new Category();
category.setCname(tuple.getElement());
category.setCid((int)tuple.getScore());
cs.add(category);
}
}
return cs;
}
2.3. dao层代码
1)findAll()方法;
//1.定义sql语句
String sql = "select * from tab_category ";
//2.执行sql
return template.query(sql,new BeanPropertyRowMapper(Category.class));
2.4. web层代码
1)header.html页面;
$.get("category/findAll", {}, function (data) {
//data: [{cid:?,cname:?},{},{}]
//拼接首页条目
var lis = '首页 ';
//遍历数组,拼接
for (var i = 0; i < data.length; i++) {
lis += ' ' + data[i].cname + ' ';
}
//拼接收藏榜
lis += '收藏排行榜 ';
//将条目添加到中
$("#category").html(lis);
});
3.个人心得
1)将业务层的对象声明在方法外,方便调用;
private CategoryService service = new CategoryServiceImpl();
2)将持久层的对象声明在方法外,方便调用;
pricate CategoryDao categoryDao = new CategoryDaoImpl();
3)sortedset排序查询,jedis.zrangeWithScores按照分数排序;
4)若redis不为空,则将set数据存到list集合来使用;
for (Tuple tuple: categorys) {
Category category = new Category();
category.setCname(tuple.getElement());
category.setCid((int)tuple.getScore());
cs.add(category);
}
5)注意Ajax返回的数据格式,以及拼接 li 标签;
//data: [{cid:?,cname:?},{},{}]
lis += '' + data[i].cname + ' ';
4.后续完成线路的分页展示
//TODO…