新闻访问量 静态网页
服务器: CPU 内存压力 数据库服务: IO压力 数据库
数据密集型 计算密集型
session: RMI RPC协议 EJB -> Spring Java虚拟机之间传输数据
session放在哪?
- 可以放在cookie中
- 不安全:
- 网络负担效率低: 每次都要传cookie
可以放在文件服务器或数据库里: * 大量的IO效率问题 * session 复制: * session数据冗余, 节点越多,效率越低 缓存数据库: 完全在内存中,速度快,数据结构简单
减少IO的读操作 水平切分 垂直切分 读写分离
MySQL 个人单机电脑 单表500万左右会有查询压力 MongoDB 文档数据库 HBase 列数据库
NoSQL 不依赖业务逻辑方式存储,而是以简单的key-value模式存储, 因此扩展能力强 不遵循SQL标准, 不支持ACID,没有事务的概念
NoSQL适用场景: * 数据高并发读写 * 海量数据的读写 * 数据高可扩展性 MySQL不适用场景: * 事务支持 * 基于SQL的结构化查询存储,处理复杂的关系
Redis-缓存数据库
数据都存在内存之中,支持持久化,主要用作备份恢复,除了支持简单的key-value模式,还支持list, set, hash, zset(sorted set有序集合)等数据结构存储,这些数据类型都支持push/pop, add/remove以及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的, redis周期性把更新数据写入磁盘
高速缓存, 热点数据,降低数据库IO, 分布式架构,做session共享
- 最新N个数据: 使用list按照自然时间排序
- 排行榜TOP N: 利用zset
- 时效性数据,手机验证码: Expire设定过期时间
- 计数器,秒杀: 原子性,自增方法 INCR, DECR
- 去除大量数据中重复数据: Set集合
- 发布订阅消息系统; pub/sub模式
redis-cli
redis-cli shutdown
redis 为什么快?
- 基于内存
- 单线程操作,模型简单,数据安全问题 线程优先级的问题
- 多路IO复用技术 NIO BIO AIO
- Tomcat 默认是BIO,多线程抢占资源时需要等待
- NIO: 非阻塞式 数据不是频繁发送时的情况可以提高效率,如果是连接请求和数据发送都多的情况下不解决问题 调度之后重复使用 使用一个线程来检查多个Socket的就绪状态,比如调用select和poll epoll函数,传入多个文件描述符
- Mapping关联: Socket 轮询来查找 只记录发数据的socket
- AIO: 订阅 用户不参与 异步处理 不是所有操作系统都支持