gpt4 book ai didi

database - 如何更新 Google App Engine NDB 对象上的数据,以便它可以同时进行多次写入

转载 作者:搜寻专家 更新时间:2023-10-30 23:44:01 24 4
gpt4 key购买 nike

情况是这样的我有一个像这样的模型

class Content(ndb.Model):
likeCount=ndb.IntegerProperty(default=0)
likeUser = ndb.KeyProperty(kind=User, repeated=True)

当一个新的内容生成时,一个新的“Content”对象会像这样生成

content_obj_key = Content(parent=objContentData.key, #Where ContentData is     another ndb.Model subclass
likeUser=[],
likeCount=0
).put()

当任何用户喜欢与下面函数相同的内容时

def modify_like(contentData_key, user_key):
like_obj = Content.query(parent=contetData_key).get()
if like_obj:
like_obj.likeUser.append(user_key)
like_obj.likeCount += 1
like_obj.put()

问题:
现在的问题是,当同时有超过 4 个用户喜欢相同的内容时,这个对象写入了错误的数据。
我的意思是假设 userA、userB、userC 和 userD 同时喜欢这个数据,目前只有 userE 喜欢相同的内容。
所以新四写完后“likeCount”不是5,总是小于5并且“likeUser”列表长度也小于5。

那么如何解决这个问题呢?这样数据始终保持一致。

最佳答案

可能是某些更新相互影响,因为多个用户可能同时递增相同的计数值。

如果 userA 和 userB 同时获得 Content 对象 - 两者具有相同的计数值 (likeCount=1)。然后两者都增加到 2 的值 - 当它应该是 3 的总和时。

一种可能的解决方案是使用分片。当您的应用程序中的实体可能有大量写入时,这很有用。该计数是该实体的所有分片总数。文档中的示例代码:

NUM_SHARDS = 5

class SimpleCounterShard(ndb.Model):
"""Shards for the counter"""
count = ndb.IntegerProperty(default=0)

def get_count():
"""Retrieve the value for a given sharded counter.

Returns:
Integer; the cumulative count of all sharded counters.
"""
total = 0
for counter in SimpleCounterShard.query():
total += counter.count
return total

@ndb.transactional
def increment():
"""Increment the value for a given sharded counter."""
shard_string_index = str(random.randint(0, NUM_SHARDS - 1))
counter = SimpleCounterShard.get_by_id(shard_string_index)
if counter is None:
counter = SimpleCounterShard(id=shard_string_index)
counter.count += 1
counter.put()

有关分片计数器的更多信息和示例可在以下位置找到: https://cloud.google.com/appengine/articles/sharding_counters

关于database - 如何更新 Google App Engine NDB 对象上的数据,以便它可以同时进行多次写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31316403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com