mysql - 请教一个Java做数据库缓存的问题
问题描述
现在在负责学校的一个图书馆个人写作平台,基本的业务模型已经完成了,但是项目在高并发环境下还没有做任何的优化。
每个学生在阅读完一本书后都可以写书评或者做笔记,书评是公开的,笔记是私有的。按照现在的做法每个学生操作都访问数据库去查询,这样以后肯定会有性能瓶颈。
我大概看了一下ehcache的相关教程但没有一个好的解决方案,主要是无法判断缓存是否失效。比如将高频学生的一定数量笔记都放入到缓存中间去的话,如果设置一个特定的超时时间5min,但是如果刚好在这5min之内又新添加或者修改了一篇笔记的话应该怎么办么?
比如在mybatis中对应一条sql语句select * from comments condition,我可以通过ehcache建立一个内存缓存,但是如果comments新添加或者更新了一条记录,怎么能优雅的更新上次在ehcache中添加的缓存。
各位网友是否能够建议一下相关的解决方案?thanks :-)
问题解答
回答1:既然是缓存,那就一定对数据实效性有容忍度,否则要严格实时的数据,就只能访问数据库查询了。
根据题主描述的业务场景来看,普遍的解决方案是通过外置索引来维护图书和书评的关系(当然索引也不是完全实时的),再通过kv缓存(redis,ehcache,map等等)来缓存书评的具体内容。在数据更新(update)时,通常情况先更新数据库,然后更新缓存,索引不需要更新。在数据更新(insert)时,需要在update基础上,再增加相应的关系到索引中。
简单的外置索引,可以在数据库中,增加一张(图书-书评)关系表,建好索引,在查询书评时先查询(分页查询)关系表,再通过书评主键,查询具体书评信息(缓存加在单条书评信息上),建议分两次查询并在内存中组装数据,不要使用连表查询(影响数据库性能)。关系表数据不需要建立缓存,只需要增加书评信息的缓存即可。
相关文章:
1. 关于docker下的nginx压力测试2. docker安装后出现Cannot connect to the Docker daemon.3. docker start -a dockername 老是卡住,什么情况?4. docker内创建jenkins访问另一个容器下的服务器问题5. docker镜像push报错6. debian - docker依赖的aufs-tools源码哪里可以找到啊?7. html5 - node静态资源服务器设置了Cache-Control,但浏览器从来不走3048. 为什么我ping不通我的docker容器呢???9. nignx - docker内nginx 80端口被占用10. dockerfile - 为什么docker容器启动不了?

网公网安备