Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为产品实现喜欢、评论、视图计数器_Mysql_E Commerce_Counter_Deadlock - Fatal编程技术网

Mysql 为产品实现喜欢、评论、视图计数器

Mysql 为产品实现喜欢、评论、视图计数器,mysql,e-commerce,counter,deadlock,Mysql,E Commerce,Counter,Deadlock,我正在创建一个电子商务后端,其中我的每个产品都有以下计数器属性 - product views - product likes - product comments count 产品数据库表的当前数据库列是 - id - likes_count - views_count - comments_count - category_id - category_parent_id - category_sub_parent_id - handling_charge - shippi

我正在创建一个电子商务后端,其中我的每个产品都有以下计数器属性

- product views
- product likes
- product comments count
产品数据库表的当前数据库列是

 - id
 - likes_count
 - views_count
 - comments_count
 - category_id
 - category_parent_id
 - category_sub_parent_id
 - handling_charge
 - shipping_charge
 - meetup_address
 - is_additional_fields
 - status
 - is_deleted
 - created_at
 - updated_at
如下面的博客所示 实现一个可以在单行上频繁更新的计数器会导致innodb上的行锁定,如果频繁更新,则会导致应用程序中出现死锁情况。但解决这个问题的方法在我的博客中有很多解释,我对此有一个想法。但是,如果有多个计数器与单个产品关联,并且在应用程序增长时可以同时更新,该怎么办。我应该如何为计数器设计数据库表。我是否需要维护单独的表格,即

likes counter table

 - id     - product_id      - count

views counter table

 - id     - product_id     - count

comments counter table

 - id     - product_id     - count
通过维护单独的表,即使产品(如+注释+视图)同时更新,它也将单独更新,并减少行死锁情况的发生。 如果它在一个表中,并且如果所有表的更新同时出现,则可能会导致问题


问题:有没有更好的方式来设计柜台的桌子?有什么建议吗?

产品表中的计数器可以查看

一个单独的表,其中包含like列(product\u id,user\u id),因此每个用户只能喜欢一个产品一次。否则,他们就可以像一个简单的计数器一样捣碎

一个单独的注释表,包含以下列(产品id、注释文本、日期等)


这就是你要问的吗?

按照你共享的链接中的建议,使用后台队列缓冲插入/更新是非常标准的,我也打算提出同样的建议

可以使用与单个计数器相同的方法重新计算多个计数器。视图计数可以缓存在Memcached/Redis中,也可以存储在单独的表中(尽管我建议只使用一些分析解决方案)

在您的工作人员中:

class-ProductCountsWorker
# ...
def执行(产品标识)
产品。查找(产品id)。更新产品计数!
结束
结束
在您的模型中:

类产品
另一个建议是将此视图计数功能拆分为关注点


谢谢您的回复。我们有不同的表,其中注释和喜欢被映射到用户。计数器表只记录注释或视图的数量。但是,这些计数是否应该单独保存?因为当点击数增加时,它会在更新过程中导致问题。我想尽可能分散潜在的行锁不会有什么坏处。不过,在编写代码时会稍微让人恼火一些。也许您可以模拟高流量/高用户输入量的情况,并检查日志以查看死锁信息。这可以帮助你决定是否值得。写几个循环,更新你的计数器,并在计数器更新之间随机休眠1-100毫秒,然后运行几个小时。出于好奇,你是否运行过任何模拟?结果如何?嗨,克里斯特鲁多,我还没有。我很快就要做一个模拟测试了,我正忙着开发。一定会在这里发布结果。太好了!期待着它考虑做所有的插入,而不是简单地增加一个值。这样你就可以报告(计数)什么时候发生了这样的流量。或者可以按天/月/等将递增值分组