一、阿姆达尔定律:S(N) = 1/(1-P) + P/Njava
P:程序中并行部分的程序在单核上执行时间的占比web
N:处理器的个数(总核心数)算法
S(N):程序在N个处理器(总核心数)相对于单个处理器(单核)中的速度提高比数据库
总结:这个公式告诉咱们,在程序中可并行代码的比例决定你增长处理器所能带来的速度的提高的上限缓存
二、ConcurrentHashMap:支持并发效率更高的Map安全
若是只调用get()方法或者put()方法,ConcurrentHashMap是线程安全的,可是若是你调用get()方法后,又调用put()方法,若是有另一个线程在当前线程调用put()返回以前调用,极可能会把以前的操做覆盖掉,不少状况下一个业务会涉及容器的多个操做,即复合操做,并发执行时,线程安全的容器只能保证自身的数据不被破坏,但没法保证业务的行为是否正确。服务器
private final Map<String, Long> wordCounts = new ConcurrentHashMap<>(); /** *若是多个线程并发调用这个increase()方法,increase()的实现就是错误的,由于多个线程用相同的word调用时,极可能会覆盖相互的结果,形成记录的次数比实际出现的次数少。 */ public long increase(String word) { Long oldValue = wordCounts.get(word); Long newValue = (oldValue == null) ? 1L : oldValue + 1; wordCounts.put(word, newValue); return newValue; } //putIfAbsent方法,若是key/value存在,则返回value,若是不存在返回null;replace若是新值和旧值相同,则返回false,反之则返回true public long increase(String word) { Long oldValue, newValue; while (true) { oldValue = wordCounts.get(word); if (oldValue == null) { // Add the word firstly, initial the value as 1 newValue = 1L; if (wordCounts.putIfAbsent(word, newValue) == null) { break; } } else { newValue = oldValue + 1; if (wordCounts.replace(word, oldValue, newValue)) { break; } } } return newValue; } //改进 public long increase(String word) { AtomicLong number = wordCounts.get(word); if (number == null) { AtomicLong newNumber = new AtomicLong(0); number = wordCounts.putIfAbsent(word, newNumber); if (number == null) { number = newNumber; } } return number.incrementAndGet(); }
三、避免死锁的方式:原子性的获取须要的多个锁或注意调整对多个锁的获取顺序cookie
四、服务器负载均衡的几种方式session
1)硬件负载均衡:中间代理转发并发
2)LVS/Nginx软件负载均衡:中间代理转发
3)名称服务:请求服务先访问名称服务器,获取处理服务器ip或域名列表并返回,请求服务器按照必定的规则进行负载选择请求的服务器地址
4)规则服务:请求服务访问规则服务器,获取规则算法并返回,请求服务器按照规则计算进行负载
5)Master-Worker服务器
五、解决应用服务器变为集群后的Session问题
web服务器是咱们天天要去吃饭的饭店,session会话数据是咱们吃饭用的碗筷,目标是保证每次吃饭都用本身的碗筷
1)Session Sticky:保证同一个会话的请求都在同一个web服务器上处理,须要在负载均衡上作选择,能够进行一致性hash实现。把碗筷放在某一家饭店里,每次都去那家饭店吃饭。
2)Session Replication(session复制):多台服务器之间实现session的同步操做。每一家饭店都放了一份本身的碗筷,这样不管去哪家均可以用本身的碗筷。
3)Session集中存储:session数据集中存储在一个session集群中,全部对session读写操做都在在这个session集群中处理。将碗筷统一的放在一块儿,每次吃饭都先去那把碗筷拿着,吃饭了再放回去。
4)Cookie Based:将session数据保存在cookie中,每次发生请求的时候coookie中都带有session的数据,能够对session进行加密处理。每次都把本身的碗筷带在身上,这样每次去任何一家饭店吃饭都用本身的碗筷。
六、数据库瓶颈解决
1)主从式读写分离
2)站内搜索引擎,至关于一个读库
3)缓存:数据缓存、页面缓存
4)分布式页面系统、分布式存储系统、分布式数据库系统
5)数据库垂直拆分(专库专用、按照页面不一样表分在不一样数据库中),水平拆分(单张表记录达到临界值,将一张表拆分红多张表放在不一样数据库中)
七、