首页 > 缓存服务器是怎么起作用的

缓存服务器是怎么起作用的

有很多文章介绍缓存服务器,但大多都只是说明概念,都在讲架构,没有实现过程。

假设我有一个大型商场,URL www.x.com/id=111,指向 id 为 111 的商品详情

不考虑多级缓存,不考虑缓存失效问题,如何用缓存来提高页面 www.x.com/id=111 性能


  1. 不要过早的优化

  2. 确定现在访问页面是不是有性能问题.

  3. 如果有性能问题, 那么瓶颈在哪里? Web Server 还是 DB, 是动态资源访问慢, 还是动态资源慢.

  4. 如果是静态资源慢可以考虑:
    a.设置文件的过期时间
    b.考虑购买CDN, 或者自己做.(varnish, squid...)

  5. 如果是动态资源慢:
    使用相关的profile工具, 分析代码执行效率. 找到比较耗时的操作.

  6. 如果是数据库操作慢:

    1. 确定数据库参数是否合理

    2. 查看慢查询log, 针对每一条SQL进行优化.

    3. 考虑是否添加缓存.(Memcache, redis...)


看题目描述,我先假设题主不是要缓存在实际项目中的各种应用及延伸,而是一个最简单的实现。就拿你的大型商城例子来说怎么实现一个最基本的缓存。

定义问题先

设置缓存的目的是提速。但速度这种东西的相对的,想提速得先知道哪慢了。相对于内存来说,从硬盘读数据慢;相对于本机来说,网络传输慢。

所以在开始缓存之前,我们先假设这个大型商场从数据库读数据这里慢了

[用户]----->[应用服务器]---(这里慢)-->[数据库服务器]

把缓存设置在应用服务器这里,先不考虑优化数据库的性能。

[用户]----->[应用服务器[缓存]]---(这里还是慢)-->[数据库服务器]

现在要求解的问题就是如何实现[缓存]这里。

实现

没有缓存时,访问URLhttp://www.x.com/index?id=111时的部分代码:

var data = Database.get(111);  // 从数据库拿数据,慢
return data;

改造后

var myAwesomeCache = {};  // 我们的缓存,只是内存中一个字典

...

var data = myAwesomeCache['111'];  // 先从内存拿,快
if (data != null) {
    return data;  // 有就直接用
}

data = Database.get('111');  // 没有才从数据库拿
myAwesomeCache['111'] = data;  // 而且拿完记得加进缓存
return data;

不考虑分布式不考虑多级不考虑失效,我们的缓存模块已经写完了。(但这个实现有问题,后面说)

分析

添加缓存前,由于每次请求都从数据库中拿数据,需要通过网络/磁盘,速度慢,数据库压力大。

现在将结果放在内存中做缓存,如果后面的请求命中了这个缓存,就能直接从内存中获取数据,而内存显然比网络/磁盘快的多。

题主的例子还包含了应用缓存机制的一个隐性条件:近期被访问过的数据有很大几率会被再次访问

比如商城的促销商品,或者淘宝爆款。一定时期内大量的访问都会指向这些数据,这时缓存的价值才最大化了。


(发散下思维,以下开始胡思乱想,推荐忽略)

回到前面说的这个简单实现的问题:没有失效机制

尽管假设中说明了可以不考虑失效,但是不失效的缓存还是缓存么

通常来说内存虽然速度比磁盘快,但成本高,容量小。这都是失效机制的意义所在(我把内存自带的断电失效机制忘了233333),更别说数据一致性的问题了。

如果有这样的一种缓存介质,成本和磁盘一样低,速度和内存一样快,断电不丢数据,又稳定又可靠,那它本身就是存储原始数据的完美位置了。。

复制出热数据加速访问的,叫缓存;
复制出全数据的,叫冗余;
复制出全数据永不失效的,叫灾备;
不仅全数据永不失效,速度还比原来快的,你可能是搞到忆阻器了。。。

【热门文章】
【热门文章】