面对数据量动辄成千上万的数据库,如何保证其稳定运行呢?
其中一个方法就是给数据库减负。
以下列举了 7 个为数据库减负的技巧:
1. 缓存
我们可以将数据直接缓存到内存中。例如 Map,也可以使用缓存框架,将一些需要频繁使用的热点数据保存在缓存中,每当用户来访问时,就可以直接将缓存中的数据返回给用户,这样可以有效降低服务器的压力。不过,可以缓存起来使用的数据,一般都不能对实时性要求太高。
2. 页面静态化
这其实可以算作是缓存的另外一种形式,相当于直接将相关的页面渲染结果存起来。在 Web 项目中,资源分为两大类,即静态资源和动态资源。前者可以不经过服务端处理,就能够直接返回给前端浏览器,浏览器就可以直接显示出来。而后者需要经过服务端渲染,才能返回前端。
在实际项目中,静态资源的访问速度要远远高于动态资源,而动态资源往往容易遇到服务器瓶颈、数据库瓶颈。因此,对于一些不经常更新或更新较慢的页面,开发者可以通过页面静态化,将一个动态资源保存为静态资源,这样当服务端需要访问的时候,直接将静态资源返回,就可以避免去操作数据库来,从而降低数据库压力。
3. 数据库优化
很多时候程序跑得慢,不是因为设备落后,而是因为数据库 SQL 写的太差劲。要解决海量数据的问题,数据库优化肯定也是不可避免的。一般来说,开发者可以从 SQL 优化、表结构优化、以及数据库分区分表等多个方面来对数据库进行优化。
4. 热点数据分离
数据库中的数据,虽然是海量数据,但是这些数据并不见得所有数据都是活跃数据,例如用户注册,有的用户注册完就消失的无影无踪了,而有的用户则在不停的登录。因此,对于这两种不同的用户,开发者可以将活跃用户分离出来,在主要操作的数据表中只保存活跃用户数据。每次用户登录,先去主表中查看有没有记录,有的话,直接登录,没有的话,再去查看其他表。通过判断用户在某一时间内的登录次数,就可以很快分离出热点数据。
5. 合并数据库操作
这个方案的宗旨其实是减少数据库操作的次数,例如多次插入操作,开发者可以合并一条 SQL 搞定多个不同条件的查询,如果条件允许的话,也可以合并成为一个查询,尽量减少数据库的操作,减少在网络上消耗,同时也降低数据库的压力。
6. 分布式数据库
数据库读写分离之后,无形中增大了代码的复杂度,所以一般还需要借助分布式数据库中间件,这样可以有效提高数据库的弹性,可以随时为数据库扩容,同时也降低代码的耦合度。
7. NoSQL 和 Hadoop
引入 NoSQL 和 Hadoop 也是解决方案之一。NoSQL 突破了关系型数据库中对表结构、字段等定义的条条框框,是用户可以非常灵活方便的操作,另外 NoSQL 通过多个存储块存储数据的特点,使得天然具备操作大优势(快)。而 Hadoop 就不必多说,大数据处理利器。
总结:
缓存、页面静态化、数据库优化、热点数据分离、合并数据操作、分布式数据库、NoSQL 和 Hadoop,我们一般做的是数据库优化和使用缓存技术,如利用 redis。