首页  >  问答  >  正文

mysql - 请教一个Java做数据库缓存的问题

现在在负责学校的一个图书馆个人写作平台,基本的业务模型已经完成了,但是项目在高并发环境下还没有做任何的优化。

每个学生在阅读完一本书后都可以写书评或者做笔记,书评是公开的,笔记是私有的。按照现在的做法每个学生操作都访问数据库去查询,这样以后肯定会有性能瓶颈。

我大概看了一下ehcache的相关教程但没有一个好的解决方案,主要是无法判断缓存是否失效。比如将高频学生的一定数量笔记都放入到缓存中间去的话,如果设置一个特定的超时时间5min,但是如果刚好在这5min之内又新添加或者修改了一篇笔记的话应该怎么办么?

比如在mybatis中对应一条sql语句select * from comments condition,我可以通过ehcache建立一个内存缓存,但是如果comments新添加或者更新了一条记录,怎么能优雅的更新上次在ehcache中添加的缓存。

各位网友是否能够建议一下相关的解决方案?thanks :-)

为情所困为情所困2710 天前696

全部回复(1)我来回复

  • 代言

    代言2017-06-12 09:21:37

    既然是缓存,那就一定对数据实效性有容忍度,否则要严格实时的数据,就只能访问数据库查询了。

    根据题主描述的业务场景来看,普遍的解决方案是通过外置索引来维护图书和书评的关系(当然索引也不是完全实时的),再通过kv缓存(redis,ehcache,map等等)来缓存书评的具体内容。
    在数据更新(update)时,通常情况先更新数据库,然后更新缓存,索引不需要更新。
    在数据更新(insert)时,需要在update基础上,再增加相应的关系到索引中。

    简单的外置索引,可以在数据库中,增加一张(图书-书评)关系表,建好索引,在查询书评时先查询(分页查询)关系表,再通过书评主键,查询具体书评信息(缓存加在单条书评信息上),建议分两次查询并在内存中组装数据,不要使用连表查询(影响数据库性能)。关系表数据不需要建立缓存,只需要增加书评信息的缓存即可。

    回复
    0
  • 取消回复