页游手游服务器(五)sql缓存层

sql的通用缓存,是实现最麻烦的一部分,对于查询结果的缓存,主要有如下的结构来缓存:

cache

  tablename--player

     statement--select * from player where vip>1

        key1 

           key2

              ...

              lastkey=查询结果

    statement2--select * from player where name='acdf'

        key1=查询结果

当下次有同样的查询来时,不用执行sql语句,直接把查询结果返回即可,如果在逻辑缓存没有发现,就直接从数据库中读取结果,再缓存起来,但是麻烦的部分在于如果执行了类似:

update player set vip=2 where name = 'abc'

这个时候要怎么上面查询结果可能是错的,因为abc之前是1,现在是2,他应该出现在上面查询结果中,这就设计到sql的查询结果剪枝

剪枝的思路是如果不能排除sql是否会影响缓存结果,就认为会影响,处理办法很简单,就是把缓存的结果扔掉。解析sql语句比较麻烦,所以实现的时候是同时指定在缓存中查询key,和真正执行的sql语句

如下:

sql:cache('player', 'name','abc'):run('select * from player where name =?', 'abc'),

虽然写起来感觉有点冗余,但是实现比较简单,命中效果也不错。

对于一个表如果有多个查询方式,会导致相同内容有多份缓存,这样会占用对于内存,不过除了这块也没有太多的内存占用,所以还好,一般缓存的内存占用,推荐在300M左右,就可以达到很好的命中了。

缓存的难点在于剪枝,其余部分包括,缓存的内容过大了怎么办,最近最后使用方式丢弃多余部分,缓存命中统计,缓存验证,等等。因为缓存这部分是不能出错的,一旦出错,上篇处理机制就完全作废了。

在通用缓存之外,不要或者谨慎使用内存对象

这部分只有实现思路,没有具体实现,等哪天有空了,再实现吧

posted on 2014-06-14 18:01  marcher  阅读(414)  评论(0编辑  收藏  举报

导航