比如在一个分布式的用户系统中,如何各自生成用户的唯一数字ID。首先没有办法用MYSQL的自增,用GUID或UUID的话又不是数字,而且很长,兼容性不好。

2010-11-17 20:21:36

12 Answers

分布式也不是不可以在不同的地方生成唯一的id,需要考虑一定的算法,之前做视频的时候一个大的系统下面有上万台设备,而且每个设备可能都不在一个省份,这些设备就能够保证很好的唯一性,就是采用了统一的数字编码,一个32位的整数可以唯一标示任何设备,这种方式也适用于类似多服务器的架构设计,先把服务器编码,然后是跟这个服务器相连接的终端编码,终端对应的数据再进行一个层次的编码,如果一个32位的数不够用可以用一个64位的整数,这种方式的好处是大家不需要考虑别的服务器的状态,不需要同步,只需要根据统一的算法生成ID就可以了,而且ID本身是个整数,在数据库查询、排序的时候效率都高。

2010-11-17 22:22:49

分布式的话,建议专门用一台ID生成服务器,用来生成唯一ID
这样有个好处,当碰撞发生后,还可以自己捕获,并重新生成ID

生成方式可以考虑自增,hash等方式

2010-11-17 23:53:03

有两个方面的思路:
1. 一个统一的UserID生成中心。类似于DHCP的方式,每个客户从该处获取,但是需要注意期限管理。
2. 在客户端找一个确定的唯一的ID。现在可选择的有MAC地址,CPUID等。

2010-11-18 01:14:31

redis,用自增的原子性即可,建议用hashes的,这样可以弄多个id生成西

或者仍然用redis,用list,这时要写一个程序,它的功能有以下几点
1.初始化list,生成M个id放入
2.监控list的元素个数,少于指定数后生成新的id放入

剩下的其他需要有id要求时直接pop请求

2010-11-18 03:34:44

我在实际应用中这样做的:
每一台分布服务器向中心服务器注册的时候,获得一个序列号,然后自己再生成本机的唯一序列号,2个序列号拼起来

保证中心服务器序列号只递增,并且每次收到注册的时候都产生一个新的序列号。这样,下属的分布服务器每次只要从1开始生成递增的唯一序列号就好了

2010-11-18 04:35:26

可以根据机器名,进程id,时间戳,随机数等生成,详情参照mongodb的objectid,很棒的空间换时间思想

2010-11-18 06:40:22
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作