mysql - 请教一个Java做数据库缓存的问题
问题描述
现在在负责学校的一个图书馆个人写作平台,基本的业务模型已经完成了,但是项目在高并发环境下还没有做任何的优化。
每个学生在阅读完一本书后都可以写书评或者做笔记,书评是公开的,笔记是私有的。按照现在的做法每个学生操作都访问数据库去查询,这样以后肯定会有性能瓶颈。
我大概看了一下ehcache的相关教程但没有一个好的解决方案,主要是无法判断缓存是否失效。比如将高频学生的一定数量笔记都放入到缓存中间去的话,如果设置一个特定的超时时间5min,但是如果刚好在这5min之内又新添加或者修改了一篇笔记的话应该怎么办么?
比如在mybatis中对应一条sql语句select * from comments condition,我可以通过ehcache建立一个内存缓存,但是如果comments新添加或者更新了一条记录,怎么能优雅的更新上次在ehcache中添加的缓存。
各位网友是否能够建议一下相关的解决方案?thanks :-)
问题解答
回答1:既然是缓存,那就一定对数据实效性有容忍度,否则要严格实时的数据,就只能访问数据库查询了。
根据题主描述的业务场景来看,普遍的解决方案是通过外置索引来维护图书和书评的关系(当然索引也不是完全实时的),再通过kv缓存(redis,ehcache,map等等)来缓存书评的具体内容。在数据更新(update)时,通常情况先更新数据库,然后更新缓存,索引不需要更新。在数据更新(insert)时,需要在update基础上,再增加相应的关系到索引中。
简单的外置索引,可以在数据库中,增加一张(图书-书评)关系表,建好索引,在查询书评时先查询(分页查询)关系表,再通过书评主键,查询具体书评信息(缓存加在单条书评信息上),建议分两次查询并在内存中组装数据,不要使用连表查询(影响数据库性能)。关系表数据不需要建立缓存,只需要增加书评信息的缓存即可。
相关文章:
1. javascript - h5上的手机号默认没有识别2. javascript - 谁能帮我创建一个webpack2+vue2+vuex+less+dev-server的空项目3. vue.js - weex scroller搭配refresh在android平台上拉会触发refresh4. python - 网站显示的图片与爬虫获取到的图片不同,应该如何确定问题?5. 极光推送 - Android app消息推送 百度 极光 个推 信鸽哪个好一些?6. css3 - Firefox 字号相对IE、Chrome更大,如何在CSS中统一?7. css - div display: inline-block; 置中?8. html5 - 如何让H5页面在手机浏览器里和微信全屏显示9. javascript - 在html中写了个<video>视频,浏览器却是一片空白为什么呢?360浏览器?10. javascript - ajax中的 textStatus 报错为 parsererror?