我的应用程序是一个游戏,我需要每个用户都能够创建一个唯一的自然数字 ID 代码,该代码可以像 url 缩短器的工作方式一样双射转换为“短字符串”。“短弦”部分对于游戏来说非常重要。
我考虑过创建一个带有自动 id 键的子节点,该子节点存储自然数索引和短字符串,以及另一个包含自然数作为键和前一个自动 id 键的子节点。
我担心万一两个用户同时创建新 ID 时会出现竞争情况。理想情况下,我希望能够从 1000 开始递增 ID,以保持短字符串非常短。
有谁知道使用 firebase-database 解决此类问题的好方法?
我想将“短字符串”的长度保持在 6 个字符以下,并且仅使用数字、大写字母和连字符。(所以 34 个字符的字母表,为了清晰起见省略了 1、ls、Os 和 0)
也许这是不可能的,我将不得不使用 50 个字符的字母表来生成随机数并将其添加到每个键中。
一种想法是检查当前的最高密钥并生成一个随机数以添加到该随机数,但仍然不能保证两个用户不会获得相同的数字。
到目前为止,如果两个用户尝试同时生成新密钥,我必须防止竞争条件的唯一其他想法是保留在线用户的内部列表,并在每个用户的子节点中创建密钥并具有在发布到数据库之前有延迟......要求用户检查所有其他用户请求的密钥。
最后一个想法似乎很复杂并且容易出错,每次用户重新连接时都需要代码来检查列表,以防他们上次在线时丢失连接。
algorithm race-condition firebase firebase-realtime-database
假设我想制作一个完全在浏览器中运行的大型,实时,2d开放世界风格的游戏,我想使用Firebase来完成它.
我们也要忽略安全方面的问题; 我稍后会问.(=
玩家从(0,0)开始,可以向任何方向移动.我在空间上对世界进行散列,以便任何给定的x,y坐标成为我可用于生成Firebase ref的单个(或嵌套)键:
var getKey = function(x, y) {
return Math.floor(x / 100) + ':' + Math.floor(y / 100);
}
var key = getKey(currX, currY);
var ref = new Firebase('https://whatever.firebaseio.com/world/' + key);
// ...
Run Code Online (Sandbox Code Playgroud)
这样的事情.当玩家在世界各地移动时,我非常确定我需要保留4到9个参考值,以使Firebase保持活跃状态以进行更改.这可能会增加一倍或三倍,这取决于我如何构建数据:是否存储在world/树中或其他地方的其他玩家?那种事.
我不希望播放器的浏览器获得它不关心的更新.当玩家四处移动时,我想"过期"旧的参考,因此浏览器不会花费资源聊聊世界上遥远的片段.
是否足以让ref实例超出范围并获得GCed?或者还有什么我必须做的事情来通知裁判我不想再使用它了吗?
我想到的另一件事并不是担心有多少参考,而是追踪on回调.当玩家离开世界特定区域的范围时,我可以进行off任何回调.这足以让我的裁判停止与Firebase交谈吗?