一,扩容思路

内存,服务器,

java 双缓冲模式 java lfu 缓存 并发实现_缓存

java 双缓冲模式 java lfu 缓存 并发实现_缓存_02

数据库:扩容.

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_03

java 双缓冲模式 java lfu 缓存 并发实现_缓存_04

二,高并发解决方案--缓存

java 双缓冲模式 java lfu 缓存 并发实现_数据_05

缓存特征:

java 双缓冲模式 java lfu 缓存 并发实现_数据库_06

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_07

java 双缓冲模式 java lfu 缓存 并发实现_数据库_08

FIFO:先进先出的策略,在缓存空间不够的情况下,或者超出空间最大限度的时候,优先被清除掉.以腾出新的空间接受新的数据.(算             法:根据缓存数据的创建时间,)

LFU:最少使用策略,无论是否过期,优先清楚使用次数最少的数据.来释放空间.(算法:主要比较元素的命中次数在保证高频数据有效         性场景下)

LRU:最近最少使用策略,无论是否过期,根据元素最后一次使用的时间戳,清除最远使用的元素.(算法:被get的时间,优先保证热点数          据有效性)

影响缓存命中率的几个因素:

java 双缓冲模式 java lfu 缓存 并发实现_数据库_09

(读多  写少)

java 双缓冲模式 java lfu 缓存 并发实现_数据库_10

(粒度越小  命中率越高)

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_11

缓存的应用和应用场景:

java 双缓冲模式 java lfu 缓存 并发实现_数据库_12

java 双缓冲模式 java lfu 缓存 并发实现_数据库_13

A,Guava Cache

java 双缓冲模式 java lfu 缓存 并发实现_数据库_14

B,

java 双缓冲模式 java lfu 缓存 并发实现_数据_15

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_16

slab的个数是有限的,page大小是1M.

memcache:单线程在32位机中最大使用内存是2G,在64位机中,则没有限制.其中key的大小最大为250个字节,item的最大数据 是1M,服务器端是不安全的.通过命令可让已经存在键值对立即失效.不能遍历里面的item因为速度缓慢. 会阻塞其他的操作.器高性能来源于两个阶段的hash,第一个是在客户端.根据key算出一个节点.第二阶段是在服务端.通过内部的一个算法,查到到对应的item并返回给客户端.是一个分阻塞的基于事件的服务器程序.可以设置key永久有效,但是这个值也会在30天后失效.

C,

Redis.

java 双缓冲模式 java lfu 缓存 并发实现_缓存_17

读的速度11万次每秒,写的速度是八万一每秒.每个操作都是原子性的.

学习地址: http://redis.cn/

java 双缓冲模式 java lfu 缓存 并发实现_缓存_18

java 双缓冲模式 java lfu 缓存 并发实现_缓存_19

java 双缓冲模式 java lfu 缓存 并发实现_数据_20

java 双缓冲模式 java lfu 缓存 并发实现_数据库_21

java 双缓冲模式 java lfu 缓存 并发实现_数据_22

java 双缓冲模式 java lfu 缓存 并发实现_缓存_23

java 双缓冲模式 java lfu 缓存 并发实现_缓存_24

只的是当某个key被高并发访问并且没有被命中,就需要查询数据库.导致大量请求到数据中.导致不必要的查询操作.缓存为空(空集合而不是null),避免请求到后面的数据库.

java 双缓冲模式 java lfu 缓存 并发实现_数据_25

java 双缓冲模式 java lfu 缓存 并发实现_数据_26

三,消息队列

java 双缓冲模式 java lfu 缓存 并发实现_数据库_27

使用消息队列的原因:

java 双缓冲模式 java lfu 缓存 并发实现_缓存_28

好处:

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_29

java 双缓冲模式 java lfu 缓存 并发实现_数据_30

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_31

java 双缓冲模式 java lfu 缓存 并发实现_数据库_32

举例:

java 双缓冲模式 java lfu 缓存 并发实现_缓存_33

java 双缓冲模式 java lfu 缓存 并发实现_数据_34

四:拆分思路:

针对性的优化,哪个模块访问量大,可以适当的扩容.

拆分原则:

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_35

java 双缓冲模式 java lfu 缓存 并发实现_缓存_36

java 双缓冲模式 java lfu 缓存 并发实现_缓存_37

java 双缓冲模式 java lfu 缓存 并发实现_缓存_38

应用 拆分

java 双缓冲模式 java lfu 缓存 并发实现_数据_39

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_40

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_41

java 双缓冲模式 java lfu 缓存 并发实现_数据_42

java 双缓冲模式 java lfu 缓存 并发实现_数据_43

五,限流

java 双缓冲模式 java lfu 缓存 并发实现_数据_44

java 双缓冲模式 java lfu 缓存 并发实现_数据库_45

六,服务降级与熔断

java 双缓冲模式 java lfu 缓存 并发实现_缓存_46

java 双缓冲模式 java lfu 缓存 并发实现_缓存_47

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_48

java 双缓冲模式 java lfu 缓存 并发实现_缓存_49

业务降级要考虑的问题:

java 双缓冲模式 java lfu 缓存 并发实现_数据库_50

\

java 双缓冲模式 java lfu 缓存 并发实现_数据库_51

java 双缓冲模式 java lfu 缓存 并发实现_数据库_52

Hystrix:

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_53

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_54

java 双缓冲模式 java lfu 缓存 并发实现_数据_55

java 双缓冲模式 java lfu 缓存 并发实现_数据库_56

七,数据库瓶颈

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_57

java 双缓冲模式 java lfu 缓存 并发实现_数据_58

java 双缓冲模式 java lfu 缓存 并发实现_数据库_59

数据库切库.

java 双缓冲模式 java lfu 缓存 并发实现_数据_60

数据库分表.

java 双缓冲模式 java lfu 缓存 并发实现_数据库_61

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_62

横向分表:切割为相同的表,取余,可以保证单表的容量不会很大.垂直企分表:根据数据的活跃度分表,把一张表拆分成多个表.

java 双缓冲模式 java lfu 缓存 并发实现_缓存_63

八,搭建高可用的系统

java 双缓冲模式 java lfu 缓存 并发实现_java 双缓冲模式_64

java 双缓冲模式 java lfu 缓存 并发实现_数据_65

java 双缓冲模式 java lfu 缓存 并发实现_数据库_66

总结:

java 双缓冲模式 java lfu 缓存 并发实现_缓存_67