原文链接:http://www.javaarch.net/jiagoushi/709.htm
分布式唯一主键生成策略的一种开销比较小的方法 分布式场景下,经常需要做分库分表,master和master结构,那么此时就会用到全局的唯一主键id。 如果使用mysql的分区策略,master到master的复制,那么此时就需要保证分区的唯一性避免主键冲突。 我们可以使用mysql的自增列,但是mysql却无法保证物理和逻辑数据库的主键唯一性。 mysql5.6以上出现了GUID,但是GUID很大,而且如果需要建索引需要拿性能会比较差。这样对于某些查询只需要索引 或者需要利用索引来满足高并发下的性能的话,GUID会是一个性能瓶颈。 一致性哈希能够来解决GUID和分片问题,在多写少读下比较好,但是mysql确实用来优化为快速的随机读。 所以我们就就试试中心化一个数据库,将单独一个数据库作为自增列生成机器,mysql的replase into和INSERT ... ON DUPLICATE KEY UPDATE是来解决主键冲突的问题,当主键存在时,当前记录会替换更新旧记录 http://dev.mysql.com/doc/refman/5.0/en/replace.html和http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html 比如创建64位的自增id: CREATE TABLE `Tickets64` ( `id` bigint(20) unsigned NOT NULL auto_increment, `stub` char(1) NOT NULL default '', PRIMARY KEY (`id`), UNIQUE KEY `stub` (`stub`) ) ENGINE=MyISAM SELECT * from Tickets64 输出: +-------------------+------+ | id | stub | +-------------------+------+ | 72157623227190423 | a | +-------------------+------+ 如果我需要一个全局的唯一的64位id,则执行: REPLACE INTO Tickets64 (stub) VALUES ('a'); SELECT LAST_INSERT_ID(); 这里flickr使用两台数据库作为自增序列生成,但是这里怎么避免单点故障问题还没有有效的方案,只是通过这两台机器做主备和负载均衡。 TicketServer1: auto-increment-increment = 2 auto-increment-offset = 1 TicketServer2: auto-increment-increment = 2 auto-increment-offset = 2 原文请查看:http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/
相关推荐
Twitter开源的Snowflake算法是一种常用的分布式ID生成策略,它将ID分为三部分:时间戳(41位)、工作机器ID(10位)和序列号(12位)。通过这种方式,可以保证ID的全局唯一性,并且有序。 #### 3.2 UUID UUID...
综上所述,选择合适的分布式ID生成策略需要综合考虑系统的特定需求、可用资源以及未来的发展方向。例如,在追求性能和扩展性的场景下,可以考虑采用基于时间戳的算法(如Snowflake算法)结合UUID的优点,以平衡唯一...
4. Native 标识符生成器:这是一种灵活的策略,Hibernate 会根据底层数据库的特性自动选择合适的生成器,可能是 `identity`、`sequence` 或 `hilo`。这种方式适应性强,但在某些情况下可能无法达到最优性能,因为它...
6. **基于布隆过滤器去重**:这是一种概率型数据结构,可以快速判断数据是否可能已经存在,但存在一定的误判率。适用于空间效率优先的场景。 7. **基于分布式缓存去重**:如Redis或Memcached,将数据的哈希值或唯一...
在`get_uuid`程序中,可能实现了其中一种或多种UUID生成方式,根据具体需求来提供不同的UUID生成服务。例如,如果需要保证UUID在分布式环境中全局唯一,可能会选择`uuid1()`;如果需要保密性,可能会选择`uuid4()`。...
这是另一种常见的数据移动方法,通过完全备份源数据库,然后在目标服务器上恢复。备份文件可以复制到目标服务器,使用RESTORE DATABASE命令进行恢复,确保源数据库和目标数据库的名称相同。强制恢复选项允许覆盖...
该工具的工作原理可能基于一种策略,例如在UUID的特定部分嵌入时间戳信息,使得在比较时能直接反映出生成的顺序。通过这种方式,即使在分布式环境中,多个节点同时生成UUID,也可以确保整体的顺序性。 使用...
Hibernate 提供了多种 ID 生成策略,如 `increment`、`identity`、`sequence` 和 `assigned` 等。 4. **适当的冗余数据**:在某些情况下,适度的冗余可以减少查询次数,从而提高性能。但这需要权衡存储空间和数据...
通过Hibernate的注解或XML映射文件(hbm.xml),我们可以定义实体类和数据库表之间的映射关系,包括主键生成策略、字段类型、关联关系等。 五、CRUD操作 Hibernate提供了丰富的API,支持对数据库的基本操作:创建...
- **Snowflake算法:** 分布式环境下生成全局唯一ID的一种高效方法。 - **自增ID:** 适用于单一数据库环境,但在分布式环境中需要额外机制确保唯一性。 #### 十一、事务隔离级别 - **Read Uncommitted:** 最低...
分库分表是一种数据库扩展策略,用于解决单个数据库在高并发、大数据量场景下的性能瓶颈问题。在大型系统中,随着用户数量和业务规模的增长,数据库的压力会急剧增加,这时就需要采用分库分表的方式来分散负载,提高...
- **`varchar`**:可变长度字符串类型,实际占用空间为字符串的实际长度加上一个额外字节的开销。 - `varchar(50)`:表示该列可以存储最多50个字符的可变长度字符串。 #### 4、`date`、`datetime`和`timestamp`数据...
在创建表时,经常会创建该表的主键、外键、唯一约束、Check约束等 语法结构 create table 表名( [字段名] [类型] [约束] ……….. CONSTRAINT fk_column FOREIGN KEY(column1,column2,…..column_n) ...