【转载自】http://www.codesky.net/article/200909/118359.html
分布式缓存简要介绍
Q:什么样的缓存才是好缓存?
能解决问题的缓存就是好缓存。这句话简直就是废话,相当于白猫、黑猫,抓住老鼠的就是好猫。
那在解决问题前提下,哪个缓存才是好缓存呢?这个问题我的答案是:缓存命中率高的缓存是好缓存。
在解决问题前提下,命中率高的缓存比命中率低的缓存,在硬件投入上可能会比较小,同时缓存的数量比命中率低的缓存数量也可能少,这样寻址的速度肯定比较快。所以命中率高的缓存是好缓存。
缓存的命中率
一个缓存的实体在被丢到缓存中后,在这个实体被缓存的期间(这个实体被缓存的生命周期内),如果外部一次都没有使用过它,这个缓存实体的命中率就是0。这个实体被请求的次数越多,它的缓存命中率越高。
上面说的是缓存中一个实体的命中率。对于缓存整体来说,它的命中率则是上面各个被缓存的个体的命中率分布图。
对于缓存来说:通常最常使用的个体之占总体的很小一部分。最不常使用的占整体的很大一部分。
所以我们经常会看到类似这样的数据:
缓存的1万个元素中,有100个被频繁的使用,几乎每分钟都会被使用一次。2000个数据,每小时被请求一次。3000个数据,每天被请求一次,剩下的数据,被丢到缓存中后一次都没有被使用过。
现在硬件发展很快,如果我们只是需要缓存1万个数据的话,我们完全可以做到不管这1万个数据是否被使用到,全部丢到缓存,这样只要找数据,肯定缓存中有这个数据。而不需要作额外的运算,或者不需要向数据库发出请求。
但是:硬件发展快,数据量发展也快。小型的网站,缓存1万条数据,也就全部缓存了。但是大型网站最少也是上百万的数据量或者上T级别的数据,这些数据量显然不能都丢到缓存。这时候设计一个合理的缓存方案,提高缓存的命中率,就非常重要。而且是必须的。
提高缓存命中率的一些常见方法
纯技术的角度来说,我们只有记录了用户的单位时间的请求数,并依照这个信息来把最常被使用的数据缓存起来。
但更多的时候,我们是根据业务逻辑来提高缓存命中率的。比如:去年,前年发表的博客,这类文章的浏览请求,一般一天至少可怜的几次。一般不应该缓存到内存中。
又比如,回复数多的帖子,一般被请求数会比回复数少的帖子会被更多人次看到。
我们应该通过上面逻辑,根据我们实际业务逻辑,提供一个缓存算法,提高缓存的命中率。让在我们硬件允许的条件下,缓存适当的数据,而不是所有数据。
一个反面的例子就是:不管三七二十一,一个大型的博客站点,一篇文章被用户请求的时候,发现不在内存缓存中,就从数据库中读出,然后丢到缓存。
要知道,现在爬虫程序很多的。另外,博客这类搜索引擎友好的站点,决大多数的访问压力是搜索引擎搜索过来的。而这些访问一般都是1小时,或者1天之内,对某篇文章只有几次甚至1次请求,之后再也没有了。上面作缓存的方法,命中率会非常低的。
这里也许就有人会问,既然你不建议我缓存这些博客的内容,但是我如何提高我站点的性能呀,我至少得保证我博客站点不会速度慢的无法响应用户请求呀。
这个问题的解决方案有很多,一个最简单的方法就是把这些博客做成静态Html页面,也就是文件系统的缓存,文件系统因为硬盘的原因,可以简单理解成可以无限扩容,这样就可以把很多命中率低的内容进行缓存。
如果你的页面需要一些动态逻辑判断,你可以把数据缓存成XML文件,然后服务器段整合这些XML文件,或者是包含文件。这也是种不错的方法。
说了这么多缓存命中率的问题,简单汇总一下缓存命中率的观点:
下面我们看看缓存的其他几个不那么重要的方面:
缓存的生命周期内的活动
永久不过期,永久不变更的内容,这类东西就不应该放在缓存。缓存是临时的存储,而不是永久的,所以缓存的生命周期是有限的。
它依次可能会经历如下活动:
缓存的过期策略
一般我会问,你所接触的缓存中,碰到过那些缓存过期策略?
最常见的几种过期策略如下:
多长时间没有被请求,则过期,最典型的就是ASP和ASP.net 提供的 Section 功能。其实它就是一个缓存。
依赖于文件变更的缓存,一旦文件被修改,缓存则过期,典型的是 WEB站点的 Web.config ,一旦这个文件变更,不但缓存重起,IIS进程也会进行一次释放工作。
在此基础上,可能看到很多依赖关系的缓存过期策略。比如依赖于数据库的缓存过期策略。
当然,业务逻辑里可能会有更复杂的过期策略,必须CSDN新版积分制论坛中,帖子列表缓存会在列表数据缓存达到600时,把它清理到550条数据。
又比如新积分制论坛帖子的缓存过期,则是没有任何列表引用这个帖子后,则这个帖子过期。
缓存的同步问题
使用缓存,则意味着同样的数据,可能有多份并存。如果你的代码没有考虑某种情况,导致了这两份数据不一致了。这时候就会有问题发生。
解决方法很简单,把你的业务逻辑,代码触发情况都考虑清楚,不要遗留没有触底的地方。
简单的方法会导致你的代码逻辑变得非常复杂。
这也就是有些人,在非必要的时候,建议你不要用缓存的原因。一旦开始使用缓存,你就应该准备增加大量的代码来处理数据同步的问题。
能解决问题的缓存就是好缓存。这句话简直就是废话,相当于白猫、黑猫,抓住老鼠的就是好猫。
那在解决问题前提下,哪个缓存才是好缓存呢?这个问题我的答案是:缓存命中率高的缓存是好缓存。
在解决问题前提下,命中率高的缓存比命中率低的缓存,在硬件投入上可能会比较小,同时缓存的数量比命中率低的缓存数量也可能少,这样寻址的速度肯定比较快。所以命中率高的缓存是好缓存。
缓存的命中率
一个缓存的实体在被丢到缓存中后,在这个实体被缓存的期间(这个实体被缓存的生命周期内),如果外部一次都没有使用过它,这个缓存实体的命中率就是0。这个实体被请求的次数越多,它的缓存命中率越高。
上面说的是缓存中一个实体的命中率。对于缓存整体来说,它的命中率则是上面各个被缓存的个体的命中率分布图。
对于缓存来说:通常最常使用的个体之占总体的很小一部分。最不常使用的占整体的很大一部分。
所以我们经常会看到类似这样的数据:
缓存的1万个元素中,有100个被频繁的使用,几乎每分钟都会被使用一次。2000个数据,每小时被请求一次。3000个数据,每天被请求一次,剩下的数据,被丢到缓存中后一次都没有被使用过。
现在硬件发展很快,如果我们只是需要缓存1万个数据的话,我们完全可以做到不管这1万个数据是否被使用到,全部丢到缓存,这样只要找数据,肯定缓存中有这个数据。而不需要作额外的运算,或者不需要向数据库发出请求。
但是:硬件发展快,数据量发展也快。小型的网站,缓存1万条数据,也就全部缓存了。但是大型网站最少也是上百万的数据量或者上T级别的数据,这些数据量显然不能都丢到缓存。这时候设计一个合理的缓存方案,提高缓存的命中率,就非常重要。而且是必须的。
提高缓存命中率的一些常见方法
纯技术的角度来说,我们只有记录了用户的单位时间的请求数,并依照这个信息来把最常被使用的数据缓存起来。
但更多的时候,我们是根据业务逻辑来提高缓存命中率的。比如:去年,前年发表的博客,这类文章的浏览请求,一般一天至少可怜的几次。一般不应该缓存到内存中。
又比如,回复数多的帖子,一般被请求数会比回复数少的帖子会被更多人次看到。
我们应该通过上面逻辑,根据我们实际业务逻辑,提供一个缓存算法,提高缓存的命中率。让在我们硬件允许的条件下,缓存适当的数据,而不是所有数据。
一个反面的例子就是:不管三七二十一,一个大型的博客站点,一篇文章被用户请求的时候,发现不在内存缓存中,就从数据库中读出,然后丢到缓存。
要知道,现在爬虫程序很多的。另外,博客这类搜索引擎友好的站点,决大多数的访问压力是搜索引擎搜索过来的。而这些访问一般都是1小时,或者1天之内,对某篇文章只有几次甚至1次请求,之后再也没有了。上面作缓存的方法,命中率会非常低的。
这里也许就有人会问,既然你不建议我缓存这些博客的内容,但是我如何提高我站点的性能呀,我至少得保证我博客站点不会速度慢的无法响应用户请求呀。
这个问题的解决方案有很多,一个最简单的方法就是把这些博客做成静态Html页面,也就是文件系统的缓存,文件系统因为硬盘的原因,可以简单理解成可以无限扩容,这样就可以把很多命中率低的内容进行缓存。
如果你的页面需要一些动态逻辑判断,你可以把数据缓存成XML文件,然后服务器段整合这些XML文件,或者是包含文件。这也是种不错的方法。
说了这么多缓存命中率的问题,简单汇总一下缓存命中率的观点:
- 小型网站可以全部数据缓存,一般压力也不会很大,可以忽略缓存命中率问题。
- 大型服务无法全部数据缓存,只能部分数据缓存,这时候就需要架构师设计出对该业务逻辑适用的缓存方法,尽可能的提高缓存的命中率。
- 提高命中率的方法大多是跟业务逻辑捆绑的,需要跟具体问题具体分析
- 对于不能被内存缓存的数据,最简单的提高性能方法就是使用文件缓存。
- 文件缓存可以整个内容缓存成一个静态文件;也可以是整个页面的一个区域被缓存成一个文件,然后被包含;也可以是把一个实体序列化成XML文件进行缓存。
下面我们看看缓存的其他几个不那么重要的方面:
缓存的生命周期内的活动
永久不过期,永久不变更的内容,这类东西就不应该放在缓存。缓存是临时的存储,而不是永久的,所以缓存的生命周期是有限的。
它依次可能会经历如下活动:
- 进入缓存。(进入缓存的时候,可能需要指定它以后的过期策略,如果不指定,需要使用系统默认的过期策略)
- 从缓存中获得它,注意,这时候需要处理线程安全的问题。
- 更新缓存,注意,也需要考虑线程安全问题
- 离开缓存,这个可能是外部请求,也可能是缓存根据过期策略把它清理掉。
缓存的过期策略
一般我会问,你所接触的缓存中,碰到过那些缓存过期策略?
最常见的几种过期策略如下:
多长时间没有被请求,则过期,最典型的就是ASP和ASP.net 提供的 Section 功能。其实它就是一个缓存。
依赖于文件变更的缓存,一旦文件被修改,缓存则过期,典型的是 WEB站点的 Web.config ,一旦这个文件变更,不但缓存重起,IIS进程也会进行一次释放工作。
在此基础上,可能看到很多依赖关系的缓存过期策略。比如依赖于数据库的缓存过期策略。
当然,业务逻辑里可能会有更复杂的过期策略,必须CSDN新版积分制论坛中,帖子列表缓存会在列表数据缓存达到600时,把它清理到550条数据。
又比如新积分制论坛帖子的缓存过期,则是没有任何列表引用这个帖子后,则这个帖子过期。
缓存的同步问题
使用缓存,则意味着同样的数据,可能有多份并存。如果你的代码没有考虑某种情况,导致了这两份数据不一致了。这时候就会有问题发生。
解决方法很简单,把你的业务逻辑,代码触发情况都考虑清楚,不要遗留没有触底的地方。
简单的方法会导致你的代码逻辑变得非常复杂。
这也就是有些人,在非必要的时候,建议你不要用缓存的原因。一旦开始使用缓存,你就应该准备增加大量的代码来处理数据同步的问题。
相关推荐
分布式缓存服务器Memcached是互联网应用中广泛使用的内存对象缓存系统,用于减轻数据库的负载,提高应用程序的性能。Memcached的设计目标是简单且高效,它通过在内存中存储数据来提供快速的数据访问。让我们深入了解...
在分布式环境中,Ehcache通过使用JGROUP来实现分布式缓存。JGROUP是一个用于构建可靠集群通信的库,可以提供组成员资格、故障检测、传输协议等多种功能,使得Ehcache能够在多个节点之间共享和同步缓存数据。Ehcache...
分布式缓存是现代Web应用程序中不可或缺的一部分,它能显著提高系统的响应速度和处理能力,减少对后端数据库的依赖。本文将深入探讨Ehcache作为JVM缓存和分布式缓存的角色,以及Redis作为分布式缓存的解决方案,包括...
本资料"30_分布式缓存相关面试题的回答技巧总结.zip"聚焦于Java领域的分布式缓存,包含了笔记.docx和PPT.pptx两个文件,旨在帮助求职者掌握面试中可能遇到的分布式缓存相关问题及其解答策略。 1. **什么是分布式...
分布式缓存是现代大型互联网应用中的重要组成部分,它能够有效地解决数据访问延迟、减轻数据库压力,提高系统的响应速度和并发处理能力。在这个300分钟的学习资料中,我们将深入探讨分布式缓存的基本概念、工作原理...
分布式缓存方案Velocity是微软为了解决大规模分布式系统中的数据缓存问题而推出的一个高效、可扩展的技术。在现代Web应用程序中,缓存是提升性能的关键工具,它减少了数据库的负载,提高了数据读取速度。Velocity...
云计算分布式缓存是一种在云计算环境中用于高效存储和访问大量数据的技术,它主要针对互联网时代的高并发、大数据量场景。分布式缓存利用非关系型数据库(NoSQL)的特性,提供高性能、可扩展性以及灵活的数据管理...
分布式缓存是现代Web应用程序中不可或缺的技术,它能够显著提高数据访问速度,减轻数据库的压力,提升系统的整体性能。Memcached是其中的佼佼者,它是一个开源、高性能、分布式的内存对象缓存系统,主要用于存储热...
### JAVA分布式缓存知识点概述 #### 一、引言 Hazelcast作为一款高性能的分布式内存数据网格系统,在Java领域内被广泛应用于构建分布式应用程序。本文档基于版本2.6.5,旨在深入探讨Hazelcast的核心功能及其应用...
分布式缓存是现代大型互联网应用中不可或缺的一部分,尤其是在JavaEE环境下。它主要用来解决数据库的高并发读写压力,提高系统的响应速度和可扩展性。本文将深入探讨分布式缓存的概念、工作原理以及如何在JavaEE应用...
### 分布式缓存架构与Ehcache集群详解 #### 一、为什么使用缓存? 在现代互联网系统中,为了提高系统的响应速度和降低数据库的压力,缓存技术被广泛应用。缓存通过暂时存储数据副本的方式来加快数据访问的速度,...
分布式缓存是现代大型互联网应用中不可或缺的一部分,它能够有效地解决数据访问的高并发和低延迟问题。Redis作为一款高性能的键值存储系统,被广泛应用于分布式缓存领域,为各种应用程序提供高效的数据缓存服务。 ...
由于其简单的实现和出色的性能,Memcached成为了众多开发者和大型网站的首选分布式缓存解决方案。随着硬件成本的降低和网络速度的提升,分布式缓存系统的应用将会更加广泛,对于构建可扩展、高性能的Web应用具有重要...
Memcached 分布式缓存学习 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态 Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。 ...
nhibernate调用各种分布式缓存客户端,包括Velocity,SysCache,SharedCache,Prevalence,MemCache,...Velocity也将集成在.NET Framework 4.0中,本文将介绍Velocity的一些预备知识、安装配置以及开发一个简单的示例。
银联的分布式缓存异地多活实践主要探讨了在分布式环境中如何确保数据的一致性和高可用性。这一实践涉及到的关键技术包括AOF-BINLOG、多写冲突解决策略以及LWW-Element-Set等。以下是对这些技术的详细解释: 1. **...
### 基于云计算的分布式缓存 #### 一、云计算架构中的分布式缓存 - **分布式缓存概述**: - 分布式缓存是一种高效的数据存储方式,它通过在网络的不同位置部署缓存节点来存储频繁访问的数据副本,以此提高数据...