- 。
- Set不能放重复的。TreeSet 底层是通过 TreeMap 来实现的(如同HashSet底层是是通过HashMap来实现的一样)TreeMap 的实现就是红黑树算法。 主要区别是一个实现map接口一个实现set接口。Collections工具类中的sort()方法比较元素,需要传入实现compareable接口的方法。
- 。
。
34.
大型网站的架构
- 分层:持久层,业务层,表示层
- 分隔:功能拆分
- 分布式部署: nginx,各种中间件, spring boot (快速配置脚手架)/ spring cloud(api网管zuul)
- 缓存(redis / memche / mongodb)
- 异步(activemq / rabbitmq / kfaka)
- 冗余
- 服务降级
单台服务器->应用/数据/文件服务器分离->缓存(本地缓存/分布是缓存)->应用服务器集群->cdn和反向代理-> 分布式数据库(借助中间件如mycat)分布式文件系统(分库分表业务拆分)-> 使用nosql数据库和搜索引擎 -> 异步处理(消息队列)
性能:浏览器(浏览器缓存(cache-control,expires),页面压缩,减少cookie传输)
CDN
缓存:
异步:
NOSQL:高性能
伸缩性: nosql天生支持海量数据,容易伸缩。应用集群容易添加服务器。缓存容易添加服务器(一致性哈希)
主要通过事件驱动(消息队列)和分布式来实施伸缩性。
- 首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。
- 然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。
- 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。
性能:
响应时间/并发数/吞吐量(tps/hps/qps)/性能计数器(top参数等)
服务器最佳线程数 = 【任务执行时间/(任务执行时间 - IO等待时间)】 * cpu内核数
如果是cpu计算型任务 : 线程数=CPU个数,如果是IO等待型的则多启动线程能够提高性能。
35.
36.
fail-fast : java util 的集合类。 遍历集合时被修改。 修改时会有标示。Concurrent Modification Exception
fail-safe :java concrent下的集合类。 基于底层复制的集合,遍历的时候遍历的是副本,不会抛出Concurrent Modification Exception异常
37.
Java8
try-with-resources
捕获多个Exception
持久带被移到堆外
38.
。
。
- 存储技术 hdfs(分布式文件系统,一个nameNode,多个dateNode), raid。
- 可用性。4个9(具备自动恢复能力高可用),全年53分钟。 5个9(极高可用),全年5分钟。2个9基本可用,全年88小时。
- 高可用: 无状态的请求打到集群上。Session复制(集群规模过大不适用),session绑定(不符合高可用)。Cookie记录session(量太大)。 session服务器。
分级管理,异步处理,服务降级,幂等性设计(不可避免的重复调用和一次调用的结果相同,交易编号的有效性校验)
幂等解决方案:
乐观悲观锁
去重表/ Source+seq 做唯一索引 , 利用数据库唯一索引
Token防止页面重复提交
状态机
数据存储系统无法满足CAP,数据一致性,可用性,分区容忍性(跨网分区伸缩)。
牺牲数据一致(补偿机制)
- 安全。 xss攻击:诱导用户点击嵌入恶意脚本的链接,窃取cookie中的敏感信息。 提交恶意脚本的请求并入库,展示页面的时候包含恶意脚本。 应对:过滤< > 等字符。 httponly(cookie中增加httpOnly属性,浏览器会禁止js访问含有httpOnly属性的cookie)
sql 注入 : 过滤特殊字符。 参数绑定(prepareStatment)
Csrf : 跨站伪造请求。Token,验证码,referer check
- 秒杀系统设计:
- 独立部署
- 页面静态化
- 专用带宽
- 随机下单URL
限制访问频率(同一个uid),限流(真正成功的才显示下单页面),消峰(缓存,中间件),
如缓存用于接受请求,消息队列用于将缓存中的请求同步到数据库
- hashmap treemap linkedhashmap
Hashmap 无序,jdk8以后底层代码改了,当链表上hashcode相同的节点大于8的时候,使用红黑树存储。线程不安全。初始容量(扩容)都是2的n次幂,原因是计算放在数组哪个位置的时候不是普通的%,而是位运算(等价不等效),2的n次幂保证按位操作高效。负载因子控制扩容的时机。超过容量*负载因子就扩容。
treeMap有序,按照key默认排序。可以自定义排序器。使用场景(按照时间页面显示每天的数据)。红黑树。
Linkhashmap : 保存输入顺序。Hashmap的子类,增加了双向链表的结构所以能够保证输入顺序。
http://www.importnew.com/27326.html