新年第一个问题,在这祝大家新年快乐……使用场景:网页游戏现在的使用情况是那段代码需要缓存数据就在哪从缓存中取比如:
   Object cacheObj = getCache("xxxxx");  // 从缓存中获取数据
然后根据cacheObj 做相关的操作。不是在统一的一处获取缓存数据,再做操作,是哪里用,就在哪里取,这样造成的问题是,到处都有缓存代码,就像log一样。。我想知道这样做对不对,还是统一的在一处获取,不过统一的在一处获取,就会将所有的对象统一的放到一个对象中……这是第一个问题·····希望大家有经验的多多指点第二个问题,关于使用缓存了,如何保证事务的唯一性现在做的是网页游戏,不会一次操作就会操作一次数据库,是定时的往数据库里去刷数据,这样就没办法保证数据的一致性比如,我把数据存入到缓存,然后每隔5分钟后操作一次数据库,把缓存中的数据存入到数据库中,但这样,但是事务就是一个问题···这里我也没有解决方案,也请大家多帮帮忙,给出一些经验建议谢谢大家在线等……

解决方案 »

  1.   

    第一个问题:
       那个功能模块需要使用缓存就在哪里写,没有问题,你也不用担心这个问题,因为各个模块的缓存策略有可能不同,但是你可以提炼出较通用的方法去应用到不同的模块。
    第二个问题:
    Object cacheObj = getCache("xxxxx");
    如果cacheObj==null,那必然是从数据库中读出来,再add到缓存中,下次再访问cacheObj 不等于null,才是你这样直接从cache中取。
    1.那么你刷数据如果是直接更新数据库的话,那么每次更新完后必然要delete掉相应的缓存,否则肯定是数据不一致。
    2.另一种方法是做缓存的时候key应该是用id来表示的,那么value你就再拼接一个数据库中对应的updatetime,这样你每次更新了数据就去比较updatetime,如果updatetime不一样,再把值取出来set缓存中的这个值,就可以了。
      

  2.   

    补充下,第二种方法类似于solr增量更新索引的方式,可以借鉴一下。
      

  3.   

    对于第一个问题,关键在于你取出cacheObj后做什么操作,如果你只是查询这个缓存,不做更新/删除等操作,那到关系不大,随去随用,如果不是,建议还是统一获取,因为你还要做更新/删除操作,做完后,你总得更新或者删除对应的缓存,这样就要做同步块,用统一的方式来获取,好管理同步。第二个问题,你说“把数据存入到缓存,然后每隔5分钟后操作一次数据库”,这样做不太保险吧,万一服务器宕掉,这5分钟内的数据就丢失了,根据业务量可以考虑把5分钟改为1分钟或更短。
    另外,你说的事务问题,就是指“没办法保证数据的一致性”吧,参考ilrxx的