gpt4 book ai didi

android - 在 Query 而不是 DatabaseRef 上使用 keepSynced() 有什么不同吗?

转载 作者:搜寻专家 更新时间:2023-11-01 08:21:05 30 4
gpt4 key购买 nike

我目前正在从 Firebase 获取单个 dataSnapshot,如下所示:

public Task<DataSnapshot> getLatestMessage(@NonNull String roomId) {
final TaskCompletionSource<DataSnapshot> source = new TaskCompletionSource<>();
DatabaseReference dbRef = mDatabase.getReference(NODE_MESSAGES).child(roomId);
dbRef.keepSynced(true);
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
source.setResult(dataSnapshot);
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
source.setException(databaseError.toException());
}
};
Query query = dbRef.orderByKey().limitToLast(1);
query.addListenerForSingleValueEvent(listener);
return source.getTask();
}

请注意,我调用了 keepSynced()dbRef对象已经。

这是示例数据结构:

/root
/messages
/$roomId
/$messageId
/content
/timestamp
/etc...

我能够按预期获得最新的单个快照数据,但我想知道,如果我移动 keepSynced() 会有什么不同吗?调用Query对象而不是 DatabaseReference ?即

    // dbRef.keepSynced(true); >> REMOVE THIS <<
ValueEventListener listener = new ValueEventListener() {...};
Query query = dbRef.orderByKey().limitToLast(1);
query.keepSynced(true); // >> ADD THIS <<
query.addListenerForSingleValueEvent(listener);

我们目前在 Firebase 上的平均负载(每天)为 50%,并且随着用户的稳定流入,我想知道它是否可以以某种方式改进应用程序中的任何内容,特别是负载方面。我什至尝试过像这样愚蠢的事情:

    dbRef.keepSynced(true);
ValueEventListener listener = new ValueEventListener() {...};
Query query = dbRef.orderByKey().limitToLast(1);
query.addListenerForSingleValueEvent(listener);
dbRef.keepSynced(false);

-- 启用 keepSynced()在开始时确保引用指向最新版本,然后在查询和添加监听器后将其禁用。不幸的是,这不提供新数据,不像保持启用时那样。

我已经完成了 Optimization DB Performance documentation并相信我已根据需要遵循建议的做法。

最佳答案

keepSynced() 调用放在 limitToLast() 查询上不会对数据库服务器的负载产生任何影响。服务器需要加载完全相同的数据并对其进行监控,它只是将最后一项返回给客户端。

我建议在您的应用中谨慎使用 keepSynced。每次调用 keepSynced 都会为您附加到的引用/查询保留一个空的监听器。这意味着每个客户端都有一个活跃的监听器来监听您调用 keepSynced 的每个聊天室,即使用户不在看那个房间。虽然这可能正是您应用用例的正确调用,但它会限制您应用的可扩展性。

如果您担心达到峰值负载,您可能需要考虑研究如何 shard your data over multiple databases .聊天应用通常相对容易 fragment ,因为每个聊天室都已经隔离。

关于android - 在 Query 而不是 DatabaseRef 上使用 keepSynced() 有什么不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50948809/

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