Android 如何将GCM注册id唯一存储到MySQL中

Android 如何将GCM注册id唯一存储到MySQL中,android,mysql,push-notification,google-cloud-messaging,Android,Mysql,Push Notification,Google Cloud Messaging,我正在设置Google云消息机制的服务器端,使用MySQL存储移动应用程序提供的注册ID。考虑到谷歌最多可以发布4k注册ID,我不得不将它们存储在一个文本字段中。到目前为止一切都很好,问题是我必须处理这样的情况: 用户登录到应用程序 该应用程序向谷歌请求注册id 应用程序将新的注册id发送到应用程序服务器 服务器存储该注册id并将其链接到当前登录的用户 该用户注销,新用户登录 应用程序向服务器发送与以前相同的注册id 服务器必须能够看到注册id已在数据库中,但已链接到其他用户 服务器从以前的用户

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

  • 用户登录到应用程序
  • 该应用程序向谷歌请求注册id
  • 应用程序将新的注册id发送到应用程序服务器
  • 服务器存储该注册id并将其链接到当前登录的用户
  • 该用户注销,新用户登录
  • 应用程序向服务器发送与以前相同的注册id
  • 服务器必须能够看到注册id已在数据库中,但已链接到其他用户
  • 服务器从以前的用户取消注册id的链接,并将其链接到新登录的用户
  • 所以问题是,我必须确保数据库中注册id的唯一性,但我不能为该文本字段添加唯一索引

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

    • 计算注册id的散列并强制该散列是唯一的,但可能存在冲突
    • 我可以将唯一的设备id与注册id一起存储,并强制该设备id是唯一的。我看到的问题是,我不知道android设备id可以使用多长时间,我认为在某些情况下它是不可用的
    • 我可以在每次收到新的注册id时执行搜索,但我认为这将导致性能非常差的操作
    我确信我不是唯一一个面临这个问题的人,但我找不到好的解决办法。我该怎么解决这个问题呢?

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

    • 为了高效搜索,您应该还有一个附加的索引哈希列(二进制(32))-我们使用
      SHA-256
      摘要算法从注册ID获取32字节的哈希。哈希列不必是唯一的。冲突应该非常罕见,即使发生冲突,您的查询也会提供少量共享相同哈希的注册ID,因此在Java代码中测试其中哪一个(如果有的话)与您要查找的注册ID实际匹配不会影响性能

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


    我读到一些不需要4k的地方,4k仅用于有效负载。。如果只想在数据库中存储gcm id,my sql varchar 256就足够了。请参阅