mysql - 请教一个Java做数据库缓存的问题
问题描述
现在在负责学校的一个图书馆个人写作平台,基本的业务模型已经完成了,但是项目在高并发环境下还没有做任何的优化。
每个学生在阅读完一本书后都可以写书评或者做笔记,书评是公开的,笔记是私有的。按照现在的做法每个学生操作都访问数据库去查询,这样以后肯定会有性能瓶颈。
我大概看了一下ehcache的相关教程但没有一个好的解决方案,主要是无法判断缓存是否失效。比如将高频学生的一定数量笔记都放入到缓存中间去的话,如果设置一个特定的超时时间5min,但是如果刚好在这5min之内又新添加或者修改了一篇笔记的话应该怎么办么?
比如在mybatis中对应一条sql语句select * from comments condition,我可以通过ehcache建立一个内存缓存,但是如果comments新添加或者更新了一条记录,怎么能优雅的更新上次在ehcache中添加的缓存。
各位网友是否能够建议一下相关的解决方案?thanks :-)
问题解答
回答1:既然是缓存,那就一定对数据实效性有容忍度,否则要严格实时的数据,就只能访问数据库查询了。
根据题主描述的业务场景来看,普遍的解决方案是通过外置索引来维护图书和书评的关系(当然索引也不是完全实时的),再通过kv缓存(redis,ehcache,map等等)来缓存书评的具体内容。在数据更新(update)时,通常情况先更新数据库,然后更新缓存,索引不需要更新。在数据更新(insert)时,需要在update基础上,再增加相应的关系到索引中。
简单的外置索引,可以在数据库中,增加一张(图书-书评)关系表,建好索引,在查询书评时先查询(分页查询)关系表,再通过书评主键,查询具体书评信息(缓存加在单条书评信息上),建议分两次查询并在内存中组装数据,不要使用连表查询(影响数据库性能)。关系表数据不需要建立缓存,只需要增加书评信息的缓存即可。
相关文章:
1. Java使用数组的速度比C ++中std :: vector快8倍。我做错什么了?2. web服务器 - Nginx可不可以理解为一个框架,上面跑的都是什么程序?3. 关于网站上传后浏览器不识别的问题4. javascript - 小米浏览器中,图片导致fixed定位的元素无法显示5. 修改mysql配置文件的默认字符集重启后依然不生效6. java - mybatis源码分析7. 在应用配置文件 app.php 中找不到’route_check_cache’配置项8. Android 高德地图如何设置缩放限制级别?9. java 输出包含逗号的字符串中的每一个字符10. javascript - 怎样限制同一个浏览器不能登录两个账号

网公网安备