1:缓存和页面静态化

数据量大这个问题最直接的解决方案就是使用缓存,缓存就是将从数据库中获取的结果暂时保存起来,在下次使用的时候无需重新到数据库中获取,这样可以大大降低数据库的压力。缓存的使用方式可以分为通过程序直接保存到内存中和使用缓存框架两种方式。程序直接操作主要是使用Map,尤其是ConcurrentHashMap,而常用的缓存框架有Ehcache、Memcache和Redis等。缓存使用过程中最重要问题是什么时候创建缓存和缓存的失效机制。
缓存的失效可以定期失效,也可以在数据发生变化的时候失效,如果按数据发生变化让缓存失效,还可以分粗粒度失效和细粒度失效。不过缓存也不是什么情况都适用,它主要用于数据变化不是很频繁的情况。

跟缓存相似的另外一种技术叫页面静态化,它在原理上跟缓存非常相似,缓存是将从数据库中获取到的数据(当然也可以是别的任何可以序列化的东西)保存起来,而页面静态化是将程序最后生成的页面保存起来,使用页面静态化后就不需要每次调用都重新生成页面了,这样不但不需要查询数据库,而且连应用程序处理都省了,所以页面静态化同时对数据量大和并发量高两大问题都有好处。
页面静态化可以在程序中使用模板技术生成,如常用的Freemarker和Velocity都可以根据模板生成静态页面,另外也可以使用缓存服务器在应用服务器的上一层缓存生成的页面,如可以使用Squid,另外Nginx也提供了相应的功能。

2:数据库优化

数据库优化的方法非常多,常用的有表结构优化、SQL语句优化、分区和分表、索引优化、使用存储过程代替直接操作等,另外有时候合理使用冗余也能获得非常好的效果。

(1)SQL优化

SQL优化有一个通用的做法就是,首先要将涉及大数据的业务的SQL语句执行时间详细记录下来,其次通过仔细分析日志(同一条语句对不同条件的执行时间也可能不同,这点也需要仔细分析)找出需要优化的语句和其中的问题,然后再有的放矢地优化。

(2)分区和分表

当数据量变多的时候,如果可以分区或者分表,那将起到非常好的效果。当一张表中的数据量变多的时候操作速度就慢了,所以很容易想到的就是将数据分到多个表中保存,但是这么做之后操作起来比较麻烦,想操作(增删改查)一个数据还需要先找到对应的表,如果涉及多个表还得跨表操作。其实在常用的数据库中可以不分表而达到跟分表类似的效果,那就是分区。分区就是将一张表中的数据按照一定的规则分到不同的区来保存,
这样在查询数据时如果数据的范围在同一个区内那么可以只对一个区的数据进行操作,这样操作的数据量更少,速度更快,而且这种方法对程序是透明的,程序不需要做任何改动。

(3)索引优化

索引的大致原理是在数据发生变化(增删改)的时候就预先按指定字段的顺序排列后保存到一个类似表的结构中,这样在查找索引字段为条件的记录时就可以很快地从索引中找到对应记录的指针并从表中获取到记录,这样速度就快多了。不过索引也是一把双刃剑,它在提高查询速度的同时也降低了增删改的速度,因为每次数据的变化都需要更新相应的索引。不过合理使用索引对提升查询速度的效果非常明显,所以哪些字段使用索引、使用什么类型的索引都需要仔细琢磨,并且最好再做一些测试。

(4)存储过程

在操作过程复杂而且调用频率高的业务中,可以通过使用存储过程代替直接操作来提高效率,因为存储过程只需要编译一次,而且可以在一个存储过程里面做一些复杂的操作。

3:分离活跃数据

通过一个定期处理的任务将不活跃的用户转移到别的数据表中,在主要操作的数据表中只保存活跃用户,查询时先从默认表中查找,如果找不到再从不活跃用户表中查找,这样就可以提高查询的效率

4:批量读取和延迟修改

批量读取和延迟修改的原理是通过减少操作的次数来提高效率,如果使用得恰当,效率将会呈数量级提升。

如果每保存一条记录都查询一次数据库,那么对每个需要检查的字段,都需要查询与要保存的记录条数相同次数的数据库,这时可以先将所有要保存的数据的相应字段读取到一个变量中,然后使用in语句统一查询一次数据库,这样就可以将n(要保存记录的条数)次查询变为一次查询了。除了这种对同一个请求中的数据批量读取,在高并发的情况下还可以将多个请求的查询合并到一次进行。
延迟修改主要针对高并发而且频繁修改(包括新增)的数据,如一些统计数据。这种情况可以先将需要修改的数据暂时保存到缓存中,然后定时将缓存中的数据保存到数据库中,程序在读取数据时可以同时读取数据库中和缓存中的数据。
这种方式下如果保存缓存的机器出现了问题将可能会丢失数据,所以如果是重要的数据就需要做一些特殊处理。

5:读写分离

读写分离的本质是对数据库进行集群,这样就可以在高并发的情况下将数据库的操作分配到多个数据库服务器去处理从而降低单台服务器的压力一般情况下是将写操作交给专门的一台服务器处理,这台专门负责写的服务器叫做主服务器。当主服务器写入(增删改)数据后从底层同步到别的服务器(从服务器),读数据的时候到从服务器读取,从服务器可以有多台,这样就可以实现读写分离.

6:分布式数据库

分布式数据库是将不同的表存放到不同的数据库中然后再放到不同的服务器。这样在处理请求时,如果需要调用多个表,则可以让多台服务器同时处理,从而提高处理速度。

数据库集群(读写分离)的作用是将多个请求分配到不同的服务器处理,从而减轻单台服务器的压力,而分布式数据库是解决单个请求本身就非常复杂的问题,它可以将单个请求分配到多个服务器处理,使用分布式后的每个节点还可以同时使用读写分离,从而组成多个节点群。

7:NOSQL和Hadoop

NoSQL是近年来发展非常迅速的一项技术,它的核心就是非结构化。我们一般使用的数据库(SQL数据库)都是需要先将表的结构定义出来。NoSQL就是突破了这些条条框框,可以非常灵活地进行操作,另外因为NoSQL通过多个块存储数据的特点,其操作大数据的速度也非常快。

Hadoop是专门针对大数据处理的一套框架,随着近年来大数据的流行Hadoop也水涨船高,出世不久就红得发紫。
Hadoop对数据的处理是先对每一块的数据找到相应的节点并进行处理,然后再对每一个处理的结果进行处理,最后生成最终的结果。比如,要查找符合条件的记录,Hadoop的处理方式是先找到每一块中符合条件的记录,然后再将所有获取到的结果合并到一起,这样就可以将同一个查询分到多个服务器处理,处理的速度也就快了,这一点传统的数据库是做不到的。

海量数据解决方案,知多少?相关推荐

  1. 海量数据和高并发解决方案

    ps :读书笔记 海量数据解决方案 缓存和页面静态化 缓存就是把从数据库中的数据暂时存起来,下次使用时无需在查询数据库.缓存分为程序直接保存到内存和框架框架2种.程序缓存一般使用currentHash ...

  2. 告别“广告依赖症”,知乎视频商业化的路难走?

    知乎迎来了上市之后收入结构的首次大调整. 北京时间8月16日美股盘前,知乎发布了截至2021年6月30日的第二季度财报,除了营收增长.月活即将破亿之外,内容商务解决方案首次成为第二大营收来源受到了外界 ...

  3. [笔试题目] 简单总结笔试和面试中的海量数据问题

    最近在笔试和面试中遇到了很多关于海量数据的问题,在此进行简单的记录,写一篇方便自己下次学习的处理海量数据的文章及在线笔记,同时也希望对你有所帮助.当然,海量数据最出名的还是七月July,但这里我是想直 ...

  4. Python 引入模块后VsCode出现问题提示 “could not be resolved” 解决方案

    这里以安装 PySimpleGUI 为例,代码中 import PySimpleGUI as sg 在 VsCode 问题提示中出现 "Import "PySimpleGUI&qu ...

  5. 知云界面怎么调?知云只翻译一句话怎么办?详解方案出炉

    快速解决 知云 中的小问题 调节知云界面字体大小 解决方案 翻译时只翻译出一句话 解决方案 调节知云界面字体大小 在使用知云翻译时,难免会出现整个界面都显示一篇文章,或者翻译界面默认字体很小,让人看起 ...

  6. 车路协同实现第二次技术革新 觉非科技路侧融合感知系统知寰™正式发布

    7月8日,第四届世界人工智能大会(WAIC)在上海召开,觉非科技正式发布了路侧融合感知产品与解决方案知寰™. 此次知寰™系统的发布标志着中国车路协同的第二次技术革新,同时也是以多传感器融合感知和高精定 ...

  7. 笔试和面试中的海量数据问题

    一. 原题重现 2015年9月27日百度笔试论述题二选一,其中第一道是关于MapReduce相关的:第二道是搜索引擎中url去重,海量数据集url如何在爬取过程中避免重复爬取过的url.       ...

  8. 简单总结笔试和面试中的海量数据问题

    最近在笔试和面试中遇到了很多关于海量数据的问题,在此进行简单的记录,写一篇方便自己下次学习的处理海量数据的文章及在线笔记,同时也希望对你有所帮助.当然,海量数据最出名的还是七月July,但这里我是想直 ...

  9. 【笔试面试】简单总结笔试和面试中的海量数据问题

    最近在笔试和面试中遇到了很多关于海量数据的问题,在此进行简单的记录,写一篇方便自己下次学习的处理海量数据的文章及在线笔记,同时也希望对你有所帮助.当然,海量数据最出名的还是七月July,但这里我是想直 ...

  10. 海量数据将亮相“全栈式中间件信息技术应用创新峰会”

    随着科技数字化.自主化上升至国家战略,国内信创领域的需求被全面激发,信创产业喜提更多资源和政策支持,行业进入快速发展黄金期. 7月8日,海量数据将亮相"全力以赴 栈无不胜"2022 ...

最新文章

  1. html5知识点补充—hgroup元素的使用
  2. 用jamon来监控你的sql执行效率
  3. Android Studio-目录结构
  4. netflix的准实验面临的主要挑战
  5. 【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的
  6. android p 权限控制,android 权限控制
  7. 【转载】煤层气大事记
  8. matlab 随机函数的使用
  9. [0]Android框架揭秘-概论
  10. 关于本特利内华达状态监测保护系统相关说明
  11. HTML特效动画、焦点图
  12. 苹果自带的清理软件_为大家推荐几款苹果电脑清理软件中排名较高的软件
  13. 处理 “回扣”的4种对策
  14. 以太网rxp rxn txp txn
  15. VR中多模式异步协作的挑战和设计考虑因素
  16. office2016、visio2016和project2016安装指针
  17. 【BBC纪录片】无人驾驶汽车的黎明(观后总结)
  18. 太湖之光超级计算机使用申请,神威太湖之光系统快速使用指南-国家超级计算无锡中心.PDF...
  19. VUE的插槽(slot和slot-scope)
  20. 反编译 jdk1.8 工具 [Procyon-Decompiler]

热门文章

  1. python token验证失败百分百解决_微信公众号token验证失败解决方案
  2. java字典序列化_在Python中解析序列化Java对象
  3. 脚本文件不变色_LoadRunner脚本开发
  4. C++自定义sort排序
  5. Inferred type 'S' for type parameter 'S' is not within its bound;
  6. 牛客网 牛客练习赛7 A.骰子的游戏
  7. 重载map排序(降序)及结构体新的赋值方式
  8. windows环境下创建多个Redis实例
  9. POJ 1442 Black Box 优先队列
  10. 评定数据之间的相似度指标----距离