小白的web优化之路 一、使用redis来缓存信息

作为一个web开发者,根据产品经理的需求来完成一个应用显然不是我们的唯一目标,很多时候,我们考虑的不仅仅是需求,而是超越需求,认识到项目上线后的性能瓶颈。很多web应用在上线后,都可能会碰到响应慢的问题,而从今天开始,我将以浅显的例子带领大家一步一步的优化web应用。

先举个栗子:

小白在做一个web列表页时,需求很简单,当用户访问第一个页的时候,服务器返回1-10条的文章简介数据,访问第2页的时候,服务器返回11-20条的文章简介数据。小白转念一想,这简单啊,每次前端给我一个页数就行,我直接从数据库中查出来,然后返回回去就行。哈哈,so easy!

当小白把程序写好上线后,随着用户以及文章的增多,数据库的压力也越大,比如当文章数量达到一百万条时,每次分页查询都需要耗时数据库500ms左右,这时候小白就意识到程序需要优化了。

这时候小白的老师来了,老师说,这些文章列表数据,在短时间中不会改变太大,为什么不把它缓存起来呢?这样每次都可以从内存中取出来,而不用每次都访问数据库了。

即项目架构由最简单的

加入了cache层:

这样,可以极大的加快访问速度。

就拿这个例子来说,你可以把每次获取的列表信心都缓存起来,为了在缓存的同时也能保持更新,你可以设置列表缓存为1分钟过期,这样这1分钟内多次访问速度会极大的提高。

至于缓存,你可以使用redis,Redis 是一个高性能的key-value数据库。可以对关系数据库起到很好的补充作用。

小白在听了老师给出的建议后,马上着手开始搭建redis开发环境,并开始开发,他写了一个demo,这个demo中,使用缓存前每次访问的速度为400-500ms,使用缓存后的访问速度稳定在25-27ms,相当于17倍的速度提升!

下面为主要的测试代码:

package com.happyheng.controller;

import com.alibaba.fastjson.JSON;
import com.happyheng.dao.ArticleDao;
import com.happyheng.model.Article;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;

import java.util.List;

/**
 *
 *
 * Created by happyheng on 17/5/6.
 */
@RestController
@RequestMapping("/test")
public class TestController {

    private static final String KEY_CACHE_ARTICLE_LIST = "article_list";

    @Autowired
    private ArticleDao articleDao;

    @RequestMapping("/testSelectFromDb")
    public List<Article> testSelectFromDb() throws Exception {

        return articleDao.getArticleListFromdb();
    }

    @RequestMapping("/testSelectFromCache")
    public String testSelectFromCache() throws Exception {

        Jedis jedis = new Jedis("localhost");
        // 先从缓存中取出数据
        String articleListStr = jedis.get(KEY_CACHE_ARTICLE_LIST);
        if (!StringUtils.isEmpty(articleListStr)) {

            return articleListStr;
        } else {

            // 如果数据为空,那么从db中取出来,然后序列化后写入到cache中,并设置1分钟的过期时间
            List<Article> articleList = articleDao.getArticleListFromdb();
            String serializeArticleListStr = JSON.toJSONString(articleList);
            jedis.set(KEY_CACHE_ARTICLE_LIST, serializeArticleListStr);
            jedis.expire(KEY_CACHE_ARTICLE_LIST, 60);
            return serializeArticleListStr;
        }

    }

}
package com.happyheng.dao;

import com.happyheng.model.Article;
import org.springframework.stereotype.Service;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 *
 *
 * Created by happyheng on 17/5/7.
 */
@Service
public class ArticleDao {

    public List<Article> getArticleListFromdb() throws Exception{

        String sql = "SELECT * FROM article ORDER BY create_time DESC LIMIT 0, 10";

        Class.forName("com.mysql.jdbc.Driver");
        Connection mConnection = DriverManager.getConnection("jdbc:mysql://localhost:3306/optimize_db", "root", "mytestcon");
        Statement statement = mConnection.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);

        try {
            List<Article> list = new ArrayList<>();
            //注意指针刚开始是-1位置,这行next()方法,会先判断下一个位置有没有,如果有,指向下一个位置。
            while (resultSet.next()) {
                Article article = new Article();
                article.setId(resultSet.getLong("id"));
                article.setTitle(resultSet.getString("title"));
                article.setContent(resultSet.getString("content"));
                article.setCreate_time(resultSet.getString("create_time"));
                list.add(article);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                resultSet.close();
                statement.close();
                mConnection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }

        return null;
    }
}

可以看到,当访问 testSelectFromDb 时,直接从数据库中获取数据,访问 testSelectFromCache 时,先从cache中获取数据,如果没有,从数据库中获取数据,然后写入到cache中,下面为两种访问方法的访问时间对比:

直接访问db:

访问cache:

时间: 2024-07-28 13:19:03

小白的web优化之路 一、使用redis来缓存信息的相关文章

阿里巴巴 web前端性能优化进阶路

Web前端性能优化WPO,相信大多数前端同学都不会陌生,在各自所负责的站点页面中,也都会或多或少的有过一定的技术实践.可以说,这个领域并不缺乏成熟技术理论和技术牛人:例如Yahoo的web站点性能优化黄金法则,以及大名鼎鼎的优化大师Steve Souders.本文并非一篇讨论性能优化技术方法的文章,而更多的是对中文站搜索List页面持续两年多的前端性能优化实践的思路总结.希望对正在从事这个领域研究的前端同学能有所帮助. 简单的说,我们的性能优化实践分为三个阶段:初探期.立规期.创新期, 每个阶段

WEB开发之路——基础部分

WEB开发之路 受BBC的<BBC: Brain Story>和<BBC: The Brain - A Secret History>的影响,我一直有志于探究人类大脑,2015年的暑假,到华南理工大学的国家重点实验室-生物医学工程实验室,实习了一个月的时间,学习大脑图像处理—Matlab语言来处理大脑的灰质和白质的图像,核心知识在计算机方面,只有掌握计算机这门工具,才能更好的分析大脑.因此,在我的坚决要求之下,2016年的暑假,家人给我联系了一家软件公司实习,从最有活力的WEB开发

魔窗研发副总裁沈哲:移动端SDK的优化之路

作者简介: 沈哲,擅长移动端.互联网后端技术,曾经在安硕信息.decarta(已被uber收购).京东商城等国内外知名软件公司.互联网公司工作.开发过decarta第一款地图导航app,今夜酒店特价app,负责过京东到家上海的移动端团队.现负责魔窗移动端团队,负责研发魔窗的sdk以及移动端相关产品. 本人自2015年9月底加入魔窗,开始着手优化魔窗移动端sdk的工作. 魔窗是基于Deep Link技术的开放平台,通过提供生态落地最后一公里的deep link.跨App store渠道的归因分析以

精细化容量管理的设备成本优化之路

版权声明:本文由梁定安原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/224 来源:腾云阁 https://www.qcloud.com/community 作者简介:梁定安,现就职于腾讯社交网络运营部,负责社交平台.增值业务的运维负责人,开放运维联盟专家委员,腾讯云布道师,腾讯课堂运维讲师. SNG社交网络运营部管理着近10万台的Linux服务器,以此支撑着腾讯社交业务海量业务与用户,如日活2.47亿的QQ.月活5.9

转:Web优化 及常用工具包

Web优化: 减少http请求 避免404错误 在html页面header加入缓存标签 Gzip压缩网页 减少cookie体积 使用外部的js和css 消减js和css 压缩js 使用css sprites技术,众多图片合成在一起,通过CSS切分,降低图片传输的频率和数据量 可以使用静态网页的,避免使用动态网页 工具包 进程管理器,CPU,内存,I/O 日志:IIS日志,windows日志,系统本身日志 使用dotTrace,跟踪方法执行时间,找出速度慢的方法,针对性优化 Sql Profile

天弘基金移动App客户端架构优化之路

天弘基金移动App客户端架构优化之路 随着移动互联网时代的到来,移动技术也随之飞速发展.如今,APP已成为绝大多数互联网企业用来获取用户的核心渠道.与此同时,伴随着业务量的增长,愈来愈多的APP也在不断地挑战着每一个移动端研发人员的知识深度,而移动端技术人员也在这个不断接受挑战的过程中,成就了今天的移动互联网时代. 天弘基金作为一家在基金,金融行业高速发展的公司,APP面临着多重挑战,如庞大的用户群体.高频的基金业务.交易安全可靠性等等.天弘基金移动端的开发小伙伴在技术和业务的多重压力下,不断推

Golang 优化之路——bitset

写在前面 开发过程中会经常处理集合这种数据结构,简单点的处理方法都是使用内置的map实现.但是如果要应对大量数据,例如,存放大量电话号码,使用map占用内存大的问题就会凸显出来.内存占用高又会带来一些列的问题,这里就不展开说了.还有就是,大量数据存放于map,查找的哈希算法消耗也会很高.这时就该考虑对数据结构进行优化.之前浏览awesome-go时发现了一种叫bitset的数据结构,今天就介绍一下它. bitset 简介 首先这是一个数据结构.从名字set不难发现,这是一个集合的数据结构.bit

Unity3d优化之路

Unity3d优化之路.U3D的架构部分已经讲了很多了,这里我想讲讲对于U3D优化的亲身体验. 优化之路分三块: 一.渲染级别. GUI部分:我使用的是NGUI,它对动态移动.旋转.缩放GUI支持的是比较差的,所以我尽量不要把过多的移动旋转缩放的部分写在GUI中,但很多情况下是避免不了的,比如:大量的伤害数字,物品掉落,图标的移动和旋转等,为了不让GUI去控制这些渲染物体,一小部分我使用3D面片代替,而大部分使用程序去生成面片渲染脱离了GUI的控制.另外在那些静态的GUI中,我使用了静态物体优化

Web优化之YaHoo Web优化的14条法则

Yahoo Web优化建议原文:Best Practices for Speeding Up Your Web Site Web应用性能优化黄金法则:先优化前端程序(front-end)的性能,因为这是80%或以上的最终用户响应时间的花费所在. 法则1. 减少HTTP请求次数 80%的最终用户响应时间花在前端程序上,而其大部分时间则花在各种页面元素,如图像.样式表.脚本和Flash等,的下载上.减少页面元素将会减少HTTP请求次数.这是快速显示页面的关键所在. 一种减少页面元素个数的方法是简化页