今天在做项目的时候,遇到这样一个需求,这个需求也比较常见:
在显示的一组list版面,当用户鼠标移动到标题的时候,出现tips提示,里面显示当前栏一些详细信息。
难点如下:
1)由于list有多个标题(比如20个),不可能在一个request中,把所有的详细信息取出来put到页面上。所以只能通过ajax异步请求的方式取的数据。
2)取详细信息比较耗性能,需要走一次搜索引擎,走一次数据库多表查询进行结果统计。虽然取的过程比较耗服务器性能,但是取的结果集对象是很小的。
3)单条详细信息load次数只跟个别会员有关,比如,只有a会员的list页面需要load 标题A的详细信息,而且当a用户多次将鼠标移到该标题上,会多次load数据。反观站点整体访问中,其他会员几乎不用load 标题A的信息。所以,把这些详细信息放到全局cache中,比如memcached中,命中率也会很低。不值得。(放session就更别提了,session不是用来放这些数据的:比如某个集群环境中,是使用session复制的机制;比如session过期,短时间内--甚至比较长的时间内,session依旧存在内存中,等等。。。)
那么如何来解决这个问题呢?
正当想说服需求方放弃这个需求时,出现了一个灵感,可以把数据cache在html页面上。思路如下:
1、在html页面上放n个input元素:<input id="list1" type="hidden" value="" />。视为cache对象;
2、首次取详细信息,通过ajax异步访问服务端,将得到的数据存放到相应的input元素中,并且在指定的div上显示详细信息;
3、之后,取同内容的详细信息,只要从相应的input元素中取得即可,并显示在指定的div上。
通过这样处理,可以避免用户多次向服务端取相同的信息。当然这样处理,不能防止恶意用户的访问,但是能满足80%用户的正常流程,还是值得这么做的。
总结一下,符合这种cache的应用场景:
1)全局cache命中率低
2)取数据过程耗性能,取得的结果集本身非常小。
3)在某种场景下,需要多次重复取数据
如果不满足其中一条,那么这种cache思路,将毫无价值。
文中所描述的,仅仅是一种cache的实现思路,并不是一种技术。