对一些不会经常发生改变的数据进行缓存优化

前台页面的数据在每一次页面加载后都会重新请求数据库来加载,对数据库的压力比较大,但对于一些不经常发生改变的数据我们可以使用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已将数据编码…)
对一些不会经常发生改变的数据进行缓存优化