对一些不会经常发生改变的数据进行缓存优化
前台页面的数据在每一次页面加载后都会重新请求数据库来加载,对数据库的压力比较大,但对于一些不经常发生改变的数据我们可以使用redis来缓存这些数据,从而减小数据库的压力,加快页面加载速度,提高用户体验
以商品的分类数据为例
分析发现,分类的数据在每一次页面加载后都会重新请求数据库来加载,对数据库的压力比较大,而且分类的数据不会经常产生变化,所有可以使用redis来缓存这个数据。(注意一定要将redis服务器启动)
代码实现:
期望redis数据存储的顺序(将来前台展示的顺序)就是sql数据库中数据存储的顺序,使用redis的sortedset有序集合数据结构
CategoryServlet代码:
@WebServlet("/category/*")
public class CategoryServlet extends BaseServlet {
private CategoryService service = new CategoryServiceImpl();
/**
* 查询所有分类
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//调用service来查询所有
List<Category> cs = service.findAll();
//序列化json返回
/*ObjectMapper mapper = new ObjectMapper();
response.setContentType("application/json;charset=utf-8");
mapper.writeValue(response.getOutputStream(),cs);*/
writeValue(cs,response);
}
CategoryServiceImpl代码:
public class CategoryServiceImpl implements CategoryService {
private CategoryDao dao = new CategoryDaoImpl();
@Override
public List<Category> findAll() {
//从redis中查询
//获取jedis客户端
Jedis jedis = JedisUtil.getJedis();
//可使用sortedset排序查询
Set<String> categorys = jedis.zrange("category", 0, -1);
List<Category> cs = null;
//判断查询的集合是否为空
if (categorys == null || categorys.size() == 0){
//如果为空,需要从数据库查询,再将数据存入redis
//从数据库查询
cs = dao.findAll();
//将集合数据存入redis中的category的key
for (int i = 0; i < cs.size() ; i++) {
jedis.zadd("category",cs.get(i).getCid(),cs.get(i).getCname());
}
}else {
//如果不为空,将set集合中的数据存入list集合,使数据结构统一
cs = new ArrayList<Category>();
for (String name : categorys) {
Category category = new Category();
category.setCname(name);
cs.add(category);
}
}
return cs;
}
}
CategoryDaoImpl代码
public class CategoryDaoImpl implements CategoryDao {
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<Category> findAll() {
String sql = "select * from tab_category";
return template.query(sql,new BeanPropertyRowMapper<Category>(Category.class));
}
}
前台代码:
//查询分类数据
$.get("category/findAll", {},function (data) {
//[{cid:1},{cname:国内游},{}]
var lis = '<li class=\"nav-active\"><a href=\"index.html\">首页</a></li>';
//遍历数组,拼接字符串(<li>)
for(var i = 0; i < data.length; i++){
var li = '<li><a href="route_list.html">'+data[i].cname+'</a></li>';
lis += li;
}
//拼接收藏排行榜的li;<li><a href="favoriterank.html">收藏排行榜</a></li>
lis+= '<li><a href="favoriterank.html">收藏排行榜</a></li>';
//将lis字符串,设置到ul的html内容中
$("#category").html(lis);
});
sql数据库存储顺序
前台展示:
redis中存储的数据(此处redis已将数据编码…)