30
30
31
31
### 2. 使用缓存为系统带来了什么问题
32
32
33
- ** 软件系统设计中没有银弹,往往任何技术的引入都像是把双刃剑。** 但是,你使用好了之后,这把剑就是好剑 。
33
+ ** 软件系统设计中没有银弹,往往任何技术的引入都像是把双刃剑。** 你使用的方式得当,就能为系统带来很大的收益。否则,只是费了精力不讨好 。
34
34
35
35
简单来说,为系统引入缓存之后往往会带来下面这些问题:
36
36
@@ -51,40 +51,36 @@ _那本地缓存的方案有哪些呢?且听 Guide 给你来说一说。_
51
51
52
52
** 一:JDK 自带的 ` HashMap ` 和 ` ConcurrentHashMap ` 了。**
53
53
54
- ` ConcurrentHashMap ` 可以看作是线程安全版本的 ` HashMap ` ,两者都是存放 key/value 形式的键值对。但是,大部分场景来说不会使用这两者当做缓存,因为只提供了缓存的功能,并没有提供其他诸如过期时间之类的功能。一个稍微完善一点的缓存框架至少要提供:过期时间、 淘汰机制、命中率统计这三点 。
54
+ ` ConcurrentHashMap ` 可以看作是线程安全版本的 ` HashMap ` ,两者都是存放 key/value 形式的键值对。但是,大部分场景来说不会使用这两者当做缓存,因为只提供了缓存的功能,并没有提供其他诸如过期时间之类的功能。一个稍微完善一点的缓存框架至少要提供:** 过期时间** 、 ** 淘汰机制** 、 ** 命中率统计 ** 这三点 。
55
55
56
56
** 二: ` Ehcache ` 、 ` Guava Cache ` 、 ` Spring Cache ` 这三者是使用的比较多的本地缓存框架。**
57
57
58
- ` Ehcache ` 的话相比于其他两者更加重量。不过,相比于 ` Guava Cache ` 、 ` Spring Cache ` 来说, ` Ehcache ` 支持可以嵌入到 hibernate 和 mybatis 作为多级缓存,并且可以将缓存的数据持久化到本地磁盘中、同时也提供了集群方案(比较鸡肋,可忽略)。
59
-
60
- ` Guava Cache ` 和 ` Spring Cache ` 两者的话比较像。
61
-
62
- ` Guava ` 相比于 ` Spring Cache ` 的话使用的更多一点,它提供了 API 非常方便我们使用,同时也提供了设置缓存有效时间等功能。它的内部实现也比较干净,很多地方都和 ` ConcurrentHashMap ` 的思想有异曲同工之妙。
63
-
64
- 使用 ` Spring Cache ` 的注解实现缓存的话,代码会看着很干净和优雅,但是很容易出现问题比如缓存穿透、内存溢出。
58
+ - ` Ehcache ` 的话相比于其他两者更加重量。不过,相比于 ` Guava Cache ` 、 ` Spring Cache ` 来说, ` Ehcache ` 支持可以嵌入到 hibernate 和 mybatis 作为多级缓存,并且可以将缓存的数据持久化到本地磁盘中、同时也提供了集群方案(比较鸡肋,可忽略)。
59
+ - ` Guava Cache ` 和 ` Spring Cache ` 两者的话比较像。` Guava ` 相比于 ` Spring Cache ` 的话使用的更多一点,它提供了 API 非常方便我们使用,同时也提供了设置缓存有效时间等功能。它的内部实现也比较干净,很多地方都和 ` ConcurrentHashMap ` 的思想有异曲同工之妙。
60
+ - 使用 ` Spring Cache ` 的注解实现缓存的话,代码会看着很干净和优雅,但是很容易出现问题比如缓存穿透、内存溢出。
65
61
66
62
** 三: 后起之秀 Caffeine。**
67
63
68
64
相比于 ` Guava ` 来说 ` Caffeine ` 在各个方面比如性能要更加优秀,一般建议使用其来替代 ` Guava ` 。并且, ` Guava ` 和 ` Caffeine ` 的使用方式很像!
69
65
70
66
本地缓存固然好,但是缺陷也很明显,比如多个相同服务之间的本地缓存的数据无法共享。
71
67
72
- _ 下面我们从为什么要有分布式缓存为接入点来正式进入 Redis 的相关问题总结。_
73
-
74
68
### 4. 为什么要有分布式缓存?/为什么不直接用本地缓存?
75
69
76
- _ 我们可以把分布式缓存(Distributed Cache) 看作是一种内存数据库的服务,它的最终作用就是提供缓存数据的服务。 _
70
+ 本地的缓存的优势非常明显: ** 低依赖 ** 、 ** 轻量 ** 、 ** 简单 ** 、 ** 成本低 ** 。
77
71
78
- 如下图所示,就是一个简单的使用分布式缓存的架构图。我们使用 Nginx 来做负载均衡,部署两个相同的服务到服务器,两个服务使用同一个数据库和缓存。
72
+ 但是,本地缓存
79
73
80
- ![ 集中式缓存架构] ( ./images/redis-all/集中式缓存架构.png )
74
+ 1 . ** 本地缓存对分布式架构支持不友好** ,比如同一个相同的服务部署在多台机器上的时候,各个服务之间的缓存是无法共享的,因为本地缓存只在当前机器上有。
75
+ 2 . ** 本地缓存容量受服务部署所在的机器限制明显。** 如果当前系统服务所耗费的内存多,那么本地缓存可用的容量就很少。
81
76
82
- 本地的缓存的优势是低依赖,比较轻量并且通常相比于使用分布式缓存要更加简单。
77
+ ** 我们可以把分布式缓存(Distributed Cache) 看作是一种内存数据库的服务,它的最终作用就是提供缓存数据的服务。 **
83
78
84
- 再来分析一下本地缓存的局限性:
79
+ 如下图所示,就是一个简单的使用分布式缓存的架构图。我们使用 Nginx 来做负载均衡,部署两个相同的服务到服务器,两个服务使用同一个数据库和缓存。
85
80
86
- 1 . ** 本地缓存对分布式架构支持不友好** ,比如同一个相同的服务部署在多台机器上的时候,各个服务之间的缓存是无法共享的,因为本地缓存只在当前机器上有。
87
- 2 . ** 本地缓存容量受服务部署所在的机器限制明显。** 如果当前系统服务所耗费的内存多,那么本地缓存可用的容量就很少。
81
+ ![ 集中式缓存架构] ( ./images/redis-all/集中式缓存架构.png )
82
+
83
+ 2 .
88
84
89
85
使用分布式缓存之后,缓存部署在一台单独的服务器上,即使同一个相同的服务部署在再多机器上,也是使用的同一份缓存。 并且,单独的分布式缓存服务的性能、容量和提供的功能都要更加强大。
90
86
0 commit comments