CH11——高并发之扩容
- 垂直扩容(会有极限点):提高系统部件性能
- 水平扩容:服务器集群等
- 数据库扩容:
- 读操作扩展:memcache、redis、CDN等缓存
- 写操作扩展:Hbase等
CH12——高并发之缓存
- 数据库负载过高时,考虑引入缓存,在以下四个环节中都可以考虑加
- 缓存特征
- 命中率(至关重要的直白哦):命中数/(命中数+未命中数);命中指能够从Redis中获取到目标数据
- 最大元素(空间):当缓存空间满时,会根据清空策略将数据持久化到数据库
- 清空策略:
- FIFO:保证数据最新,即保证实时性
- LFU:清除最少使用,保证高频数据可用
- LRU:清楚最近最少使用,保证热点数据可用
- 过期时间:自己就设定expire时间
- 随机:随机清除
- 缓存命中率的影响因素
- 业务场景和业务需求:缓存适合读多写少的场景(写的话要从数据库更新)
- 缓存的粒度和策略:缓存粒度越细命中率越高
- 缓存容量和基础设施:目前大多使用LRU策略;单机内置缓存简单但是容易遇到单机瓶颈,分布式缓存容易扩展但是带来调度成本;保证可用性的做法有一致性哈希
- 缓存分类和应用场景
- 本地缓存:编程实现,没有过多网络开销;但是缓存与应用耦合,不能缓存不能共享。
- 分布式缓存:Memcache、Redis等,本身就是一个独立的应用,多个应用容易共享
- 使用缓存有两个前提条件:一是数据访问热点不均匀,某些数据会被更频繁的访问;二是数据在某个时间段内有效,不会很快过期,否则容易发生脏读。
- 高并发场景下缓存常见问题
- 缓存一致性:
- 缓存并发:多个不同key请求未能在缓存中找到,请求都打到数据库上,数据库负载增加
- 缓存穿透:也叫缓存击穿,多次查询同一个缓存中不存在的数据,导致数据库负载增加;
- 避免方式:1. 缓存空对象 2. 使用bloom过滤器对同一key 的请求做拦截(适合更新不频繁的数据)
- 缓存雪崩:大量请求由于各种原因打到数据库,最后导致数据库宕机,可以通过限流,降级等来避免。
- 缓存一致性: