当系统达到一定流量时,一般都会通过增加缓存来提高系统性能。下面是最典型的缓存原理图:
![](https://box.kancloud.cn/85ef24cfb01bb90b56d9039dddbb6e09_290x506.png)
根据上图实现的缓存机制,简单而实用,而且程序也比较简单,确实能大幅度提升系统性能。
但是当程序往数据库里增加或者更新数据时,就要同时更新缓存,如下图
![](https://box.kancloud.cn/7e2197f0a43da745413a3455de9a78bf_419x386.png)
当缓存很多,并且如果业务创建缓存的地方分散在各个功能,各个文件里时,很容易导致有些缓存忘记更新,从而导致一些业务上的错误,而这些错误很难通过测试来发现的。
在实际项目的实践中,缓存的难度主要是在缓存的更新部分。举个例子,假如一个简单用户表结构如下
```
CREATE TABLE `wp_user` (
`uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`nickname` varchar(50) NULL COMMENT '用户名',
`mobile` varchar(30) NULL DEFAULT NULL COMMENT '联系电话',
`login_count` int(10) NULL DEFAULT 0 COMMENT '登录次数',
`in_blacklist` tinyint(2) NULL DEFAULT 0 COMMENT '是否拉黑',
PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 ROW_FORMAT = Compact;
```
系统通过用户ID创建一个缓存,缓存的内容是ID对应这个用户的所有信息,即有用户名,电话,登录次数,是否拉黑这些信息。
- 假如系统提供一个更新用户信息的功能,能更新用户名,联系电话,那么用户在提交数据更新到数据库时,也要更新上面的缓存。
- 假如用户每次登录时都把登录次数加1,那么更新完后也要更新上面的缓存。
- 假如管理员在后台把这个用户拉黑,也要更新上面的缓存。
我们看到上面三个功能都要更新同一个缓存,如果这三个功能都写在一个文件里还好,否则后续要加新的更新操作时就很容易忘了更新。如果是几个程序员协同开发那更是噩梦。
**有没有一种方法,让缓存不用关心这么多业务更新操作?**
有,我们可以通过以下方式实现
![](https://box.kancloud.cn/1cdff275227c0362774ddc2a3ef57eb1_267x443.jpg)
业务系统只需要直接更新数据库即可,所有更新缓存的操作都由本终极解决方案自动完成。是不是很清爽,是不是很高大上!
**它通过减少更新数据库后需要执行一堆更新缓存的业务代码,实现系统代码指数级精简**