技术分类

解决问题类型 技术
功能性 JAVA、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN
扩展性 Struts、Spring、SpringMVC、Hibernate、Mybatis
性能 NoSQL、Java线程、Hadoop、Nginx、MQ、ElasticSearch

随着web技术的不断发展,用户访问量的大幅度提升,同时也产生了大量的用户数据,加之智能移动设备的普及,
所有的互联网平台都面临着巨大的性能挑战。

web服务器面临着CPU及内存压力,数据库服务器面临着IO压力。

问题及主要解决方案

CPU及内存压力:主要为session存储问题

但session应该存在哪里呢?

  1. 存储在cookie中

    优点:极高的扩展性和可用性

    缺点:不安全

  2. 存储在文件服务器或者数据库里

    优点:简单高性能,支持分布式与集群

    缺点: 数据库的大量IO效率问题

  3. session复制

    优点: 实现简单、配置较少、当网络中有机器Down掉时不影响用户访问

    缺点: 广播式复制有一定廷时,会带来一定网络开销;session对象内容相同,空间浪费造成session数据冗余,节点(服务器)越多浪费越大

  4. 存储在缓存数据库(例NoSQL数据库)

    优点: 不经过IO,减少访问数据库的频率,完全在内存中,速度快,数据结构简单,无形中缓解了CPU及内存压力

IO压力

随着数据量的增多,数据库操作逐渐麻烦,效率也急剧降低

  1. 数据库表进行拆分

    水平切分、垂直切分、读写分离,通过破坏一定的业务逻辑来换取性能

  2. 缓存数据库(例NoSQL数据库)

    通过添加缓存数据库,从中查询数据,从而减少IO的读操作,极大地提高查询效率

NoSQL数据库概述

NoSQL(Not Only SQL),意思为“不仅仅是SQL”,泛指非关系型数据库。

NoSQL相较于MySQL,它不依赖业务逻辑方式存储,而以简单的key-value模式存储,因此大大的增加了数据库的扩展能力。

  • 不遵循SQL标准
  • 不支持ACID(即原子性、一致性、隔离性、持久性)
  • 远超于SQL的性能

NoSQL数据库打破了传统关系型数据库以业务逻辑为依据的存储模式,而是针对不同数据结构类型改为以性能为最有限的存储方式。

适用场景
  • 对数据高并发读写,例如“购物秒杀系统”
  • 海量数据读写
  • 对数据高可扩展性的
不适用场景
  • 取代通过键查询,而是通过值来查询。 Key-Value数据库中根本没有通过值查询的途径。
  • 需要储存数据之间的关系。在Key-Value数据库中不能通过两个或以上的键来关联数据。
  • 事务的支持。在Key-Value数据库中故障产生时不可以进行回滚。

常见NoSQL数据库

数据库名称 特点
Memcache 1. 很早出现的NoSQL数据库
2. 多线程+锁的机制,数据库都在内存中,一般不持久化
3. 支持简单的key-value模式,支持类型单一
4. 一般是作为缓存数据库辅助持久化的数据库
Redis 1. 几乎覆盖了Memcache的绝大部分功能
2. 单线程+多路IO复用的机制,数据都在内存中,支持持久化,主要用作备份恢复
3. 除了支持简单的key-value模式,还支持多种数据结构的存储,如list、set、hash、zset等
4. 一般是作为缓存数据库辅助持久化的数据库
MongoDB 1. 文档型数据库
2. 数据都在内存中,若内存不足,则把不常用的数据存到硬盘
3. 虽然是key-value模式,但是对value(尤其是json)提供强大的查询功能
4. 支持二进制数据及大型对象
5. 可根据数据特点替代RDBMS,成为独立数据库,亦或配合RDBMS,存储特定数据

看完上面对NoSQL的介绍,对Redis有一个大概了解了吧

Redis概述

Redis是当今社会最受欢迎的NoSQL数据库之一,是一个使用ANSI C编写的开源,遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,且提供多种语言的API。

Redis具备以下特性:

  • 开源C语言代码,支持单线程+多路IO复用,不依赖外部库,速度极快
  • 数据持久化,支持多种数据结构、编程语言
  • 高并发读写,支持lua脚本,主从复制
  • 高可用,支持分布式,理论上可以无限扩展

Redis的应用场景包括:
缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。

github,twitter,微博,Stack Overflow,阿里巴巴,百度,腾讯,美团,搜狐......