专栏首页玩转JavaEE给数据库减负的八个思路

给数据库减负的八个思路

传统的企业级应用,其实很少会有海量应用,因为企业的规模本身就摆在那里,能有多少数据?高并发?海量数据?不存在的!

不过在互联网公司中,因为应用大多是面向广大人民群众,数据量动辄上千万上亿,那么这些海量数据要怎么存储?光靠数据库吗?肯定不是。

今天松哥和大家简单的聊一聊这个话题。

海量数据,光用数据库肯定是没法搞定的,即使不读松哥这篇文章,相信大家也能凝聚这样的共识,海量数据,不是说一种方案、两种方案就能搞定,它是一揽子方案。那么这一揽子方案都包含哪些东西呢?松哥从以下八个方面来和大家聊聊。

1.缓存

首先第一种解决方案就是缓存了。

缓存,我们可以将数据直接缓存在内从中,例如 Map、也可以使用缓存框架如 Redis 等,将一些需要频繁使用的热点数据保存在缓存中,每当用户来访问的时候,就可以直接将缓存中的数据返回给用户,这样可以有效降低服务器的压力。

可以缓存起来使用的数据,一般都不能对实时性要求太高。

2.页面静态化

页面静态化其实可以算作是缓存的另外一种形式,相当于直接将相关的页面渲染结果缓存起来。首先大家知道,在我们的 Web 项目中,资源分为两大类:

  • 静态资源
  • 动态资源

静态资源就是我们常见的 HTML、CSS、JavaScript、图片等资源,这些资源可以不经过服务端处理,就可以直接返回给前端浏览器,浏览器就可以直接显示出来。

动态资源则是指我们项目中的 Servlet 接口、Jsp 文件、Freemarker 等,这些需要经过服务端渲染之后,才可以返回前端的资源。

在实际项目中,静态资源的访问速度要远远高于动态资源,动态资源往往很容易遇到服务器瓶颈、数据库瓶颈,因此,对于一些不经常更新的页面,或者说更新比较缓慢的页面,我们可以通过页面静态化,将一个动态资源保存为静态资源,这样当服务端需要访问的时候,直接将静态资源返回,就可以避免去操作数据库了,降低数据库的压力。

例如松哥以前做过的一个电商项目,系统根据大数据统计,自动统计出用户当前搜索的热点商品,这些热点商品,10 分钟更新一次,也就是说,在十分钟内,用户登录上来看到的热点商品都是相同的。那么就没有必要每次都去查询数据库,而是将热点数据的页面,通过输出流自动写到服务器上,写成一个普通的 HTML 文件,下次用户来访问,在 10 分钟有效期内,直接将 HTML 页面返回给用户,就不必操作数据库了。

一般来说,Freemarker、Velocity 等都有相关的方法可以帮助我们快速将动态页面生成静态页面。

这就是页面静态化。

3.数据库优化

很多时候程序跑得慢,不是因为设备落后,而是因为数据库 SQL 写的太差劲。

要解决海量数据的问题,数据库优化肯定也是不可避免的。一般来说,我们可以从 SQL 优化、表结构优化、以及数据库分区分表等多个方面来对数据库进行优化。数据库优化其实也是一门巨大的学问,松哥以后看有时间写个连载和大家仔细聊聊这个话题。

4.热点数据分离

数据库中的数据,虽然是海量数据,但是这些数据并不见得所有数据都是活跃数据,例如用户注册,有的用户注册完就消失的无影无踪了,而有的用户则在不停的登录,因此,对于这两种不同的用户,我们可以将活跃用户分离出来,在主要操作的数据表中只保存活跃用户数据。每次用户登录,先去主表中查看有没有记录,有的话,直接登录,没有的话,再去查看其他表。

通过判断用户在某一段时间内的登录次数,就可以很快分离出热点数据。

5.合并数据库操作

这个方案的宗旨其实是减少数据库操作的次数,例如多次插入操作,我们可以合并成一条 SQL 搞定。多个不同条件的查询,如果条件允许的话,也可以合并成为一个查询,尽量减少数据库的操作,减少在网络上消耗,同时也降低数据库的压力。

6.数据库读写分离

数据库的读写分离其实松哥在之前的 MyCat 中也和大伙聊过了(MyCat 系列),读写分离之后,一方面可以提高数据库的操作效率,另一方面也算是对数据库的一个备份。这一块的具体操作大家可以参考松哥前面的文章。

7.分布式数据库

数据库读写分离之后,无形中增大了代码的复杂度,所以一般还需要借助分布式数据库中间件,这样可以有效提高数据库的弹性,可以方便的随时为数据库扩容,同时也降低代码的耦合度。

8.NoSQL 和 Hadoop

另外,引入 NoSQL 和 Hadoop 也是解决方案之一。NoSQL 突破了关系型数据库中对表结构、字段等定义的条条框框,使用户可以非常灵活方便的操作,另外 NoSQL 通过多个存储块存储数据的特点,使得天然具备操作大数据的优势(快)。不过,老实说,NoSQL 目前还是在互联网项目中比较常见,在传统的企业级应用中还是比较少见。

Hadoop 就不必说了,大数据处理利器。

很多时候技术和架构只是一个工具,所有的东西都摆在你面前,关键是如何把这些东西组合在一起,使之产生最大化收益,这就需要大家慢慢琢磨,松哥后面也尽量和大家多分享一些这方面的经验。

好了,简单的从 8 个方面和大家聊一聊这个问题,大家在工作中有没有遇到类似问题呢?你都是怎么处理的?欢迎留言讨论。

本文分享自微信公众号 - 牧码小子(a_javaboy),作者:江南一点雨

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 扎心一问:数据库分库分表就能无限扩容吗?

    刚工作的小伙伴,总会有各种疑问,刚开始是对 JDK API 的疑问,对 NIO 的疑问,对 JVM 的疑问,当工作几年后,对服务的可用性,可扩展性也有了新的疑问...

    江南一点雨
  • Linux上安装MongoDB

    MongoDB在Windows上的安装过程整体上来说并不难,网上的资料也比较多,这里我就不介绍了,我主要说下如何在Linux环境下安装MongoDB。 ----...

    江南一点雨
  • Spring Security 如何将用户数据存入数据库?

    http://mpvideo.qpic.cn/0bf2rqaayaaahaal3guno5pfbdgdbsgaadaa.f10002.mp4?dis_k=84a...

    江南一点雨
  • 给数据库减负的八个思路,盘它!

    传统的企业级应用,其实很少会有海量应用,因为企业的规模本身就摆在那里,能有多少数据?高并发?海量数据?不存在的!

    数据和云
  • NoSQL(MongoDB,Hbase,Redis)介绍

      NoSQL,泛指非关系型的数据库,随着互联网的发展传统的关系型数据库面对持续增长的数据处理起来显得越来越力不从心,此时非关系型数据库应运而生。

    用户4919348
  • 数据库减负的八个思路 轻松应对海量存储难题

    传统的企业级应用,其实很少会有海量应用,因为企业的规模本身就摆在那里,能有多少数据?高并发?海量数据?不存在的! 不过在互联网公司中,因为应用大多是面向广大人...

    数据和云01
  • 为什么要使用redis数据库?它有哪些妙用?

    redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统。它支持存储的value类型相对更多,包括stri...

    Java编程指南
  • 聊聊数据库

    众所周知,文明的发展离不开信息的积累,而任何东西的积累离不开存储。因此,信息存储是文明发展的重要环节,从某种意义上讲,甚至可以说是人类迈入文明社会的标志之一。在...

    数据社
  • 九张图读懂大型网站架构演化

    最初始的网站架构 就像我们在自己电脑上搭建了一个论坛的网站,应用程序(例如Apache服务器)、数据库等都部署在我们自己的电脑上的。就可以正常运行了。 应用服务...

    码云Gitee
  • 【腾讯云的1001种玩法】十分钟轻松搞定云架构 · 数据库的主备 双活 读写分离

    主备是指我们在使用数据库时,同时有主数据库和备数据库,主数据库主要提供服务,备数据库以备不时之需。为什么数据库应该做主备机?数据库的读写分离又到底有什么好处?今...

    白宦成

扫码关注云+社区

领取腾讯云代金券