本文在《使用缓存的9大误区(上)》的基础上继续讨论了使用缓存的几个误区,包括:缓存大量的数据集合,而读取其中一部分;缓存大量具有图结构的对象导致内存浪费;缓存应用程序的配置信息;使用很多不同的键指向相同的缓存项;没有及时的更新或者删除再缓存中已经过期或者失效的数据。 在购物站点中,常见的操作就是查询一些产品的信息,这个时候,如果用户输入了“25寸电视机”,然后查找相关的产品。这个时候,在后台,我们可以查询数据库,找到几百条这样的数据,然后,我们将这几百条数据作为一个缓存项缓存起来,代码的代码如下:
同时,我们对找出的产品进行分页的显示,每次展示10条。其实在每次分页的时候,我们都是根据缓存的键去获取数据,然后选择下一个10条数据,然后显示。
相信大家看完这个图,然后结合之前的讲述应该很清楚了问题所在了:每次都按照缓存键获取全部数据,然后在应用服务器那里反序列化全部数据,但是只是取其中10条。 当然,查询和缓存的方式有很多,拆分的方式也有很多,这里这是给出一些常见的问题! 为了更好的说明这个问题,我们首先看到下面的一个类结构图,如图: 如果我们要把一些Customer数据缓存起来,这里就可以可能出现两个问题: 下面,我们看到第二个问题。这个问题主要是由于第一个问题引起的:原本在缓存Customer的时候,已经将Customer的其他信息,例如Order,Product已经缓存了。但是很多的技术人员不清楚这一点,然后又把Customer的Order信息去缓存在其他的缓存项,使用的使用就根据Customer的标识,例如ID去缓存中获取Order信息,如下代码所示:
解决这个问题的方法也比较明显,参看第一个问题的解决方案就可以了!
因为在应用的中的一些配置,可能会发生变化,最简单的就是数据库连接字符串了,如下代码:
当这样设置之后,每隔一段时间缓存失效之后,就去重新读取配置文件,这时候,可能此时的配置就和之前不一样了,并且其他的地方都可以读取缓存从而进行更新,特别是在多台服务器上面部署同一个站点的时候,有时候,我们没有及时的去修改每个服务器上面的站点的配置文件里面的信息,这个时候如何使用分布式缓存缓存配置信息,只要更新一个站点的配置文件,其他站点就全部修改了,技术人员皆大欢喜。OK,这确实看起来是个不错的方法(在必要的时候可以采用一下),但是,不是所有的配置信息都要保持一样的,而且还要考虑怎样一个情况:如果缓存服务器出了问题,宕机了,那么我们所有使用这个配置信息的站点可能都会出问题。
我们有时候会遇到这样的一个情况:我们把一个对象缓存起来,用一个键作为缓存键来获取这个数据,之后,我们又通过一个索引作为缓存键来获取这个数据,如下代码所示:
我们之所以这样写,主要因为我们会以多种方式来从缓存中读取数据,例如在进行循环遍历的时候,需要通过索引来获取数据,例如index++等,而有些情况,我们可能需要通过其他的方式,例如,产品名来获取产品的信息。 如果遇到这样的情况,那么就建议将这些多个键组合起来,形成如下的形式:
另外一个常见的问题就是:相同的数据被缓存在不同的缓存项中,例如,如果用户查询尺寸为36寸的彩电,那么可能有可能一个编号为100的电视产品就在结果中,此时,我们将结果缓存。另外,用户在查找一个生产厂家为TCL的电视,如果编号为100的电视产品又出现在结果中,我们把结果又缓存在另外一个缓存项中。这个时候,很显然,出现了内存的浪费。
当然,这其中有很多的细节和问题需要解决,这里就不一一述说,要看各自的应用和情况而定! 也非常欢迎大家提供更好的方法。
这种情况应该是使用缓存最常见的问题,例如,如果我们现在获取了一个Customer的所有没有处理的订单的信息,然后缓存起来,类似的代码如下:
之后,用户的一个订单被处理了,但是缓存还没有更新,那么这个时候,缓存中的数据就已经有问题!当然,我这里只是列举的最简单的场景,大家可以联想自己应用中的其他产品,很有可能会出现缓存中的数据和实际数据库中的不一样。
汪洋,现任惠普架构师、信息分析师《NET 应用架构设计:模式、原则与实践》作者。上海益思研发管理咨询有限公司首席软件架构专家,软件咨询组副组长。 来源:汪洋@infoQ |
|
来自: weijianian > 《asp.net》