Skip to content

Commit 6881e52

Browse files
author
代码风水师
committed
更新了缓存热点key的文章
1 parent c0815dc commit 6881e52

File tree

2 files changed

+53
-13
lines changed

2 files changed

+53
-13
lines changed

README.md

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
* 集合框架 (第 17 篇) 源码分析:CopyOnWriteArrayList 与 CopyOnWriteArraySet
2525

2626

27+
2728
### 二、:radio::radio::radio:JVM(Java虚拟机)
2829
* [Java虚拟机 (第 01 篇) 深入理解:JVM内存区域(运行时数据区)](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/jvm/RuntimeDataAreas.md)
2930
* [Java虚拟机 (第 03 篇) 深入理解:垃圾收集算法](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/jvm/GarbageCollectionAlgorithm.md)
@@ -34,6 +35,7 @@
3435
* Java虚拟机 (第 08 篇) 深入理解:打破双亲委派模型
3536

3637

38+
3739
### 三、:closed_lock_with_key:Java多线程与并发框架:unlock:
3840
* [Java多线程与并发框 (第 01 篇) 深入理解:线程的状态](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/multithreads/ThreadStatus.md)
3941
* [Java多线程与并发框 (第 02 篇) 深入理解:线程和进程的区别](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/multithreads/ThreadAndProcess.md)
@@ -52,6 +54,7 @@
5254
* Java多线程与并发框 (第 15 篇) 深入理解:ThreadLocal
5355

5456

57+
5558
### 四、:satellite::satellite::satellite:网络协议:globe_with_meridians::globe_with_meridians::globe_with_meridians:
5659
* [网络协议 (第 01 篇) 精讲:ISO的OSI七层参考模型与TCP/IP四层参考模型](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/networking/NetworkModel.md)
5760
* [网络协议 (第 02 篇) 精讲:HTTP/1.1、HTTP/2.0、HTTPS的区别](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/networking/HTTP1.1HTTP2.0HTTPS.md)
@@ -65,6 +68,7 @@
6568
* [网络协议 (第 10 篇) 精讲:常见HTTP状态码及含义](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/networking/StateCode.md)
6669

6770

71+
6872
### 五、:leaves::four_leaf_clover::fountain:Spring 5.x 核心篇
6973
* [Spring 5.x (第 01 篇) 核心篇:反射机制](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/spring/Reflection.md)
7074
* [Spring 5.x (第 02 篇) 核心篇:静态代理、jdk动态代理与CGLib](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/spring/DynamicProxy.md)
@@ -92,6 +96,7 @@
9296
* [Spring 5.x (第 24 篇) 核心篇:SpringBoot 2.x 启动过程](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/spring/SpringBootStart-upProcedure.md)
9397

9498

99+
95100
### 六、:bird::bird::bird:MyBatis3 源码分析
96101
* MyBatis3 (第 01 篇)源码分析:SqlSession
97102
* MyBatis3 (第 02 篇)源码分析:SqlSessionFactory
@@ -110,6 +115,7 @@
110115
* MyBatis3 (第 14 篇)源码分析:一级缓存和二级缓存
111116

112117

118+
113119
### 七、:closed_book::green_book::blue_book::notebook_with_decorative_cover::books:高性能 MySQL
114120
* [数据库 (第 01 篇)精讲:数据库的三大范式与五大约束](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/database/NormalformAndConstraint.md)
115121
* [数据库 (第 02 篇)精讲:事务的ACID四大特性与四种隔离级别](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/database/ACIDAndIsolationLevel.md)
@@ -118,19 +124,23 @@
118124
* [数据库 (第 05 篇)精讲: SQL优化](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/database/SQLOptimization.md)
119125
* [数据库 (第 06 篇)精讲: 数据库拆分](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/database/DBSplit.md)
120126

127+
128+
121129
### 八、:sunny::umbrella::zap:Redis 核心应用
122-
- Redis(第01篇)核心:数据结构与底层数据结构
123-
- [Redis(第02篇)核心:Redis单线程模型为啥这么快?](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/cache/SingleThreadModel.md)
124-
- [Redis(第03篇)核心:持久化之RDB与AOF](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/cache/Persistence.md)
125-
- [Redis(第04篇)核心:主从复制与故障转移](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/cache/Replication.md)
126-
- Redis(第05篇)核心:高可用与 Sentinel 哨兵
127-
- Redis(第06篇)核心:分布式缓存与 Redis Cluster
128-
- [Redis(第07篇)核心:缓存击穿(缓存穿透)、缓存雪崩](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/cache/CachePenetration.md)
129-
- [Redis(第08篇)核心:热点key](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/cache/HotKey.md)
130-
- Redis(第09篇)核心:布隆过滤
130+
- Redis(第 01 篇)核心:数据结构与底层数据结构
131+
- [Redis(第 02 篇)核心:Redis单线程模型为啥这么快?](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/cache/SingleThreadModel.md)
132+
- [Redis(第 03 篇)核心:持久化之RDB与AOF](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/cache/Persistence.md)
133+
- [Redis(第 04 篇)核心:主从复制与故障转移](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/cache/Replication.md)
134+
- Redis(第 05 篇)核心:高可用与 Sentinel 哨兵
135+
- Redis(第 06 篇)核心:分布式缓存与 Redis Cluster
136+
- [Redis(第 07 篇)核心:缓存击穿(缓存穿透)、缓存雪崩](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/cache/CachePenetration.md)
137+
- [Redis(第 08 篇)核心:热点key](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/cache/HotKey.md)
138+
- Redis(第 09 篇)核心:布隆过滤
139+
- Redis(第 10 篇)核心:缓存数据一致性
140+
131141

132-
### 九、:telescope::tokyo_tower::satellite:分布式系统
133142

143+
### 九、:telescope::tokyo_tower::satellite:分布式系统
134144
* [分布式系统 (第 01 篇) 精讲:集群与分布式](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/distribution/WhatisDistributed.md)
135145
* [分布式系统 (第 02 篇) 精讲:CAP定理与BASE理论](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/distribution/CAPandBASE.md)
136146
* [分布式系统 (第 03 篇) 精讲:X/Open DTP 与 XA 事务](https://github.com/about-cloud/JavaCore/blob/master/resource/markdown/distribution/XA.md)
@@ -149,6 +159,7 @@
149159
* 分布式系统 (第 16 篇) 精讲:分布式支付框架的实现
150160

151161

162+
152163
### 十、:microscope::microscope::microscope:微服务
153164
* 微服务 (第 01 篇) 精讲:微服务与SOA
154165
* 微服务 (第 02 篇) 精讲:服务建模
@@ -163,6 +174,7 @@
163174
* 微服务 (第 10 篇) 精讲:SpringCloud
164175

165176

177+
166178
### 十一、:bicyclist::horse_racing::snowboarder:高并发与高可用
167179
* 高并发与高可用 (第 01 篇) 精讲:全局id生成算法
168180
* 高并发与高可用 (第 01 篇) 精讲:如何实现请求幂等性
@@ -172,6 +184,8 @@
172184
* 高并发与高可用 (第 01 篇) 精讲:数据持久化 + ACK + 补偿重试+请求幂等性+防重设计
173185
* 高并发与高可用 (第 01 篇) 精讲: 抢红包系统实现(高并发系统三把利刃:缓存、限流、降级)
174186

187+
188+
175189
### :soon:未完,待续 ...
176190

177191
### 联系作者:flags:

resource/markdown/cache/HotKey.md

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,37 @@
11
<h3 style="padding-bottom:6px; padding-left:20px; color:#ffffff; background-color:#E74C3C;">Redis热点Key</h3>
22

3-
在一定时间内,被频繁访问的key称为 **热点key** 。比如突发性新闻,微博上常见的热搜新闻,引起千千万万人短时间内浏览;在线商城大促活动,消费者比较关注的商品突然降价,引起成千上万消费者点击、购买。热点key所在服务器的压力骤然上升,如果超出物理机器的承载能力,则缓存不可用,进而诱发缓存击穿、缓存雪崩的问题。
3+
在一定时间内,被频繁访问的key称为 **热点key** 。比如突发性新闻,微博上常见的热搜新闻,引起千千万万人短时间内浏览;在线商城大促活动,消费者比较关注的商品突然降价,引起成千上万消费者点击、购买。热点key会导致流量过于集中,缓存服务器的压力骤然上升,如果超出物理机器的承载能力,则缓存不可用,进而可能诱发缓存击穿、缓存雪崩的问题。
44

5-
![缓存击穿](https://i.loli.net/2019/02/19/5c6b968d1e946.png)
5+
![缓存击穿](https://i.loli.net/2019/02/22/5c6f888d77c01.png)
66

77

88

99
#### 解决方案
1010

11-
**1. 读写分离:** 读写分离比较适用于写少读多的情景,
11+
---
12+
13+
##### 一、读写分离
14+
15+
![读写分离](https://i.loli.net/2019/02/22/5c6fbae592c5d.png)
16+
17+
通过将数据的写入与读取分散去各个节点,通过数据复制到达各个节点数据一致性的目的。在写少的情形下,master节点写入数据,在读取请求压力大的情形下,配置多个slave节点,数据横向同步(拓扑结构)。结合Redis Sentinel (或其他高可用技术)实现缓存节点的高可用。
18+
19+
20+
21+
##### 二、阿里云云数据库 Redis 版解决方案
22+
23+
![阿里云云数据库 Redis 版解决方案](https://i.loli.net/2019/02/22/5c6f8da9c4e60.png)
24+
25+
在热点 `Key` 的处理上主要分为写入跟读取两种形式,在数据写入过程当 `SLB` 收到数据 `key1` 并将其通过某一个 `Proxy` 写入一个 `Redis`,完成数据的写入。假若经过后端热点模块计算发现 `key1` 成为热点 `key` 后, `Proxy` 会将该热点进行缓存,当下次客户端再进行访问 `key1` 时,可以不经 `Redis`。最后由于` Proxy` 是可以水平扩充的,因此可以任意增强热点数据的访问能力。
26+
27+
28+
29+
##### 三、热点key不过期
30+
31+
如果key存在,那么不要设置key过期时间,如果key对应的数据不可用(比如删除了),那么从缓存中删除key。从请求来说,如果在缓存找到对应的key,表明该key及其value就是用户需要的数据。如果缓存中不存在对应的key,表明无对应的数据,返回空值。比如微博发来爆料某明星文章,短时间内访问量直接上升,如果key不过期,那么请求永远命中缓存。只有当文章被删除的时候,才从缓存中删除对应的key,如果此时还有请求访问,在缓存中查无数据时,直接返回空值,表明文章被删除。当然也可以更新key对应的value值,返回想要表达的value。
32+
33+
34+
35+
**参考资料:**
36+
37+
[阿里云:热点 Key 问题的发现与解决](https://help.aliyun.com/document_detail/67252.html)

0 commit comments

Comments
 (0)