如何将 GCM 注册 ID 唯一地存储到 MySQL 中

Posted

技术标签:

【中文标题】如何将 GCM 注册 ID 唯一地存储到 MySQL 中【英文标题】:How to store uniquely a GCM registration id into MySQL 【发布时间】:2013-10-08 15:39:34 【问题描述】:

我正在设置 Google 云消息传递机制的服务器端,使用 mysql 来存储移动应用程序提供的注册 ID。鉴于 Google 最多可以发布 4k 个注册 ID,我不得不将它们存储在 TEXT 字段中。到目前为止一切都很好,问题是我必须处理这样的情况:

    用户登录应用 应用向 google 请求注册 ID 应用将新的注册 ID 发送到应用服务器 服务器存储该注册 ID 并将其链接到当前登录的用户 该用户注销,新用户登录 应用向服务器发送与之前相同的注册 ID 服务器必须能够看到注册 id 已经在数据库中但链接到另一个用户 服务器将注册 id 与前一个用户取消链接,并将其链接到新登录的用户

所以问题是我必须确保数据库中注册 ID 的唯一性,但我无法为该 TEXT 字段添加唯一索引。

我能想到的可能解决方案:

计算注册 ID 的哈希并强制该哈希唯一,但可能会发生冲突。 我可以将唯一的设备 ID 与注册 ID 一起存储,并强制该设备 ID 是唯一的。我看到的问题是我不知道 android 设备 id 可以多长时间,而且我认为在某些情况下它不可用。 我可以在每次收到新的注册 ID 时执行搜索,但我认为这会导致性能非常差的操作。

我确信我不是唯一面临这个问题的人,但我找不到好的解决方案。有什么想法可以解决这个问题吗?

【问题讨论】:

【参考方案1】:

为了存储注册 ID 本身,最好使用 VARBINARY(4096) 列。如果您使用高效的字符集(例如 UTF-8)对注册 ID 进行编码,它比 TEXT 更有效。

1234563哈希列不必是唯一的。冲突应该很少见,即使发生,您的查询也会为您提供少量共享相同哈希的注册 ID,因此在您的 Java 代码中测试其中一个(如果有)不会影响性能实际与您要查找的注册 ID 匹配。

如果您选择存储唯一的设备 ID 并根据它进行搜索,我建议您为每个设备分配自己的标识符。该标识符可以是(例如)BIGINT(java 中的 long)。您可以要求应用程序在首次启动时调用您的服务器以获取唯一标识符。您可以将其存储在设备的外部存储中,以便卸载该应用然后重新安装的设备仍具有相同的标识符。

【讨论】:

我读到了一些不需要 4k 的地方,4k 仅用于有效负载..如果您只想将 gcm id 存储在您的 my sql varchar 256 中就足够了..refer groups.google.com/forum/#!msg/android-gcm/q2PzJTP71TY/…

以上是关于如何将 GCM 注册 ID 唯一地存储到 MySQL 中的主要内容,如果未能解决你的问题,请参考以下文章

GCM Phonegap,如何将消息发送到手机的核心通知

GCM:如何从服务器向应用程序发送消息(丢失注册 ID、通知 ID ...)

管理 GCM 注册 ID

GCM 的注册 ID 重复

如何在应用程序中正确更新 GCM 注册 ID

如何处理 GCM 更改注册 ID?