数据库频繁更新的表,而且这个这个表的部分字段频繁读写排序,我这里经常出现死锁,该怎么设计才能避免死锁呢?
这个表是新闻表
[news]
id
viewTimes 总浏览量
viewTimesToday 今日浏览量
viewTimesWeek 本周 浏览量
viewTimesMonth 本月浏览量
这几个浏览量的字段,页面访问一次就会更新一次
更新非常频繁
而且为了提高检索速度 做了排序索引
select top 100 *from news order by viewTimes desc
select top 100 *from news order by viewTimesToday desc
select top 100 *from news order by viewTimesWeek desc
到底该怎么设计呢?
如果把这些统计的信息单独放到另外一张表,虽然不会有过多的死锁情况,但那样在检索文章的时候就没法排序了
这些情况基本上在网站访问量大的情况下产生
不知道大侠们遇到过这样的问题没
有没有什么好的方法?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
可以考虑定期更新统计表。如果只是浏览次数排序的话,我感觉检索到2分钟前的浏览量也不是什么大不了的。
此外这张新闻表实时更新也没有必要。理论上来说应该有张浏览明细纪录表,实时记录每次一条新闻被浏览的时间,然后从这个列表中统计出各种浏览次数。当然这样可能统计次数会很费时间,为此可以每天或更短的时段更新一次统计次数表,同时清空浏览明细。这样的话,统计次数就是一个很少更新的存量,再加一个从较小的明细中获得的当天增量。
而浏览明细纪录可以放在内存里,这样就避免了频繁写入数据库。
我的做法是把热数据放到了redis中,前几十页的数据都从redis中获取,通过redis来排序,大部分的用户只会访问到redis中的内容,少量用户会访问到redis中不存在的数据,这个时候在查库,数据库的压力非常小,只要要保证redis和数据库中的数据一致性。