高并发与大数据解决方案概述


概述

随着业务的不断丰富,高并发和海量数据的处理日益成为影响系统性能的重要问题。下面将提供一些针对并发问题和海量数据处理的解决方案。

海量数据的解决方案:

  • 缓存
  • 页面静态化
  • 数据库优化
  • 分离活跃数据
  • 批量读取和延迟修改
  • 读写分离
  • 分布式数据库
  • NoSQL和Hadoop

高并发的解决方案:

  • 应用和静态资源分离
  • 页面缓存
  • 集群与分布式
  • 反向代理
  • CDN
  • 底层的优化

海量数据的解决方案

缓存

数据量大最直接的解决方案就是使用缓存,缓存就是将从数据库获取的结果暂时保存起来,在下次使用的时候无需从数据库获取,这样可以大大降低数据库的压力。

缓存的使用方式有两种,一是通过程序直接保存到内存中,二是使用缓存框架。
程序直接操作缓存主要使用Map,尤其是CurrentHashMap。
常用的缓存框架有Ehcache、Memcache、Redis,等等。

缓存的适用情况
缓存主要用于数据变化不是很频繁的情况,如果缓存数据的实时性要求较高,那么会造成缓存数据与真实数据不一致的情况。


页面静态化

页面静态化是将程序最后生成的页面保存起来,页面静态化后就不需要再次调用生成页面了。
这样不仅不需要再查询数据库了,连程序处理都省了。

  • 模板技术
    页面静态化可以在程序中使用模板技术生成。常用的模板引擎有:FreeMarker,Thymeleaf,Velocity,等等。

  • 缓存服务器
    可以使用缓存服务器,在应用服务器的上一层缓存生成的页面,可以使用代理缓存服务器Squid,Nginx也提供了相应的功能。


数据库优化

数据库优化可以在不增加硬件成本的前提下提高处理效率,常用的数据库优化方法有:表结构优化、SQL语句优化、分区和分表、索引优化、使用存储过程代替直接操作等,另外有时候合理使用冗余也能获得非常好的效果。

表结构优化

表结构优化是数据库中最基础也是最重要的,如果表结构优化得不合理,就可能导致严重的性能问题,具体怎么设计更合理也没有固定不变的准则,需要根据实际情况具体处理。

表结构优化建议
1. > 数据类型选择
数据库操作中最为耗时的操作就是IO处理,大部分数据库操作90%以上的时间都花在了IO读写上面。所以尽可能减少IO 读写量,可以在很大程度上提高数据库操作的性能。
我们无法改变数据库中需要存储的数据,但是我们可以在这些数据的存储方式方面花一些心思。下面的这些关于字段类型的优化建议主要适用于记录条数较多,数据量较大的场景,因为精细化的数据类型设置可能带来维护成本的提高,过度优化也可能会带来其他的问题:
- > (1)数字类型:
非万不得已不要使用DOUBLE,不仅仅只是存储长度的问题,同时还会存在精确性的问题。同样,固定精度的小数,也不建议使用DECIMAL,建议乘以固定倍数转换成整数存储,可以大大节省存储空间,且不会带来任何附加维护成本。对于整数的存储,在数据量较大的情况下,建议区分开 TINYINT / INT / BIGINT 的选择,因为三者所占用的存储空间也有很大的差别,能确定不会使用负数的字段,建议添加unsigned定义。当然,如果数据量较小的数据库,也可以不用严格区分三个整数类型。
- > (2)字符类型:
- > 非万不得已不要使用 TEXT 数据类型,其处理方式决定了他的性能要低于char或者是varchar类型的处理。定长字段,建议使用 CHAR 类型,不定长字段尽量使用 VARCHAR,且仅仅设定适当的最大长度,而不是非常随意的给一个很大的最大长度限定,因为不同的长度范围,MySQL也会有不一样的存储处理。
- > (3)时间类型:
尽量使用TIMESTAMP类型,因为其存储空间只需要 DATETIME 类型的一半。对于只需要精确到某一天的数据类型,建议使用DATE类型,因为他的存储空间只需要3个字节,比TIMESTAMP还少。不建议通过INT类型类存储一个unix timestamp 的值,因为这太不直观,会给维护带来不必要的麻烦,同时还不会带来任何好处。
- > 4.ENUM & SET:
对于状态字段,可以尝试使用 ENUM 来存放,因为可以极大的降低存储空间,而且即使需要增加新的类型,只要增加于末尾,修改结构也不需要重建表数据。如果是存放可预先定义的属性数据呢?可以尝试使用SET类型,即使存在多种属性,同样可以游刃有余,同时还可以节省不小的存储空间。

SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开。所以SET成员值本身不能包含逗号。
SET最多可以有64个不同的成员。当创建表时,SET成员值的尾部空格将自动被删除。当检索时,保存在SET列的值使用列定义中所使用的大小写来显示。请注意可以为SET列分配字符集和校对规则。对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写。
MySQL用数字保存SET值,所保存值的低阶位对应第1个SET成员。如果在数值上下文中检索一个SET值,检索值的位置对应组成列值的SET成员。例如,你可以这样从一个SET列检索数值值:
mysql> SELECT set_col+0 FROM tbl_name;
使用实例:[sql]

CREATE TABLE `TestSet` (  
`Id` int(4) NOT NULL AUTO_INCREMENT,  
`set1` set('ABC','1111','2222','XXX') DEFAULT NULL,  
PRIMARY KEY (`Id`)  
)ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;  
INSERT INTO `testset` VALUES ('1','a');  
INSERT INTO `testset` VALUES ('2', 'ABC');
INSERT 
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值