浅谈Web缓存思想和选择

1996 查看

Start

缓存的归类和选择

    缓存分为两种。文件缓存和内存缓存。生成静态文件,这种就是文件缓存,还有吧结果集序列化存在文件也算是。第二种就是内存缓存,我们直接把结果集序列化存在内存中的。他们的相同点在于,把结果缓存起来,节省了动态脚本语言解析的开销,数据库IO的开销。而且思路上都是采取了K-V的形式,即缓存一个结果集给了一个独一无二的键。不同点在于,从速度上,内存缓存肯定优于文件缓存,文件缓存也需要磁盘的IO,内存则是长驻,直接读取,但是呢,硬盘肯定是很便宜的,内存那么贵,而且有概率会丢数据。还有缓存讲究一个命中率,即你生成的这个缓存,后面有多少请求会再次取到,如果命中率极低,那么你的设计思路是有问题的,这样无形浪费了磁盘或者内存,多做了无用功。再者,初期的时候,很多WEB站习惯把各种服务搭在一台机器上,这个就会出事。缓存无非于一把双刃剑,带来速度上提升的同时,也占着你的内存,如果你又不规划好缓存的话,出现了缓存当storage用,你觉得你机子内存才多少,后面内存吃紧,走交换区swap(自行百度),CPU调度繁忙,宕机也是随时的事情。所以呢,用好缓存很重要的思路,第一,配置上严格控制内存占用的上限,这个可以通过配置参数来修改,第二评估缓存的命中率,是否真有必要做缓存。内存缓存服务的话,其实市面上来说,Memcache和Redis居多。然后呢,Redis目前使用比率远大于Memcache。

Memcache和Redis

  • 相同点:都是基于K-V,都是内存。

  • 不同点:mc只有单纯K-V数据类型,而Redis数据类型会比较丰富,散列,队列(常用于异步消息队列),集合,排序等等。还有一些特性。另外,它支持数据持久化,即内存的数据会异步写到硬盘,即使出现故障了,启动后,会从硬盘读取。但是呢,很多人想,哇,真不错,那么我可以当成常规数据库使用,我是土豪不差钱,内存买买买。但是要知道,写到硬盘的规则是从配置文件上的规则来的,比如说设置了,超过多少键被改写,超过几兆发生了改变,则写入硬盘。那么问题来了,假设我还差一个键发生改变,符合了写硬盘的条件,然后出现了故障,服务挂了。那么这期间一部分数据就丢掉,而且数据又很重要的话,那么就完了。

总结:

    命中率,减少磁盘IO,资源开销,缓存数据落地到磁盘。