数据库频繁更新的表,而且这个这个表的部分字段频繁读写排序,我这里经常出现死锁,该怎么设计才能避免死锁呢?

这个表是新闻表

[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

到底该怎么设计呢?

如果把这些统计的信息单独放到另外一张表,虽然不会有过多的死锁情况,但那样在检索文章的时候就没法排序了

这些情况基本上在网站访问量大的情况下产生

不知道大侠们遇到过这样的问题没

有没有什么好的方法?

阅读 5.2k
2 个回答

可以考虑定期更新统计表。如果只是浏览次数排序的话,我感觉检索到2分钟前的浏览量也不是什么大不了的。
此外这张新闻表实时更新也没有必要。理论上来说应该有张浏览明细纪录表,实时记录每次一条新闻被浏览的时间,然后从这个列表中统计出各种浏览次数。当然这样可能统计次数会很费时间,为此可以每天或更短的时段更新一次统计次数表,同时清空浏览明细。这样的话,统计次数就是一个很少更新的存量,再加一个从较小的明细中获得的当天增量。
而浏览明细纪录可以放在内存里,这样就避免了频繁写入数据库。

我的做法是把热数据放到了redis中,前几十页的数据都从redis中获取,通过redis来排序,大部分的用户只会访问到redis中的内容,少量用户会访问到redis中不存在的数据,这个时候在查库,数据库的压力非常小,只要要保证redis和数据库中的数据一致性。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏