怎么生成全局唯一ID

全局ID生成

目前TDDL(Taobao Distribute Data Layer)提供的id生成是依托数据库来进行的,oracle可以直接使用sequence来完成,mysql需要dba建议一个表专门用于生成id。

为什么需要全局id?

1、在分布式环境中,数据库是可以拆分的,一张表的自增机制只能保证该表唯一,在数据合并到历史库,迁移或者查询,如果出现id冲突,简直就是噩梦。

2、数据库访问时高成本的操作,也要避免每次INSERT都要到id生成器作DB层面的查询。

业界常用的一些UUID方案。

1、UUID

UUID由以下几部分组合:

1)当前日期和时间,UUID的第一部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一部分不同,其余相同。

2)时钟序列

3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

优势:API简单、易用

不足:占用空间大、字符串本身无法加工,可读性不强。

用一个简单的C#示例来学习掌握工厂方法设计模式

相关概念

工厂方法是创造性设计模式,即与对象创建有关。 在工厂方法中,我们创建对象而不将创建逻辑暴露给客户端,并且客户端使用相同的公共接口来创建新类型的对象。

我们的想法是使用静态成员函数(静态工厂方法)来创建和返回实例,从而隐藏用户的类模块的细节。

工厂方法是创建对象的核心设计原则之一,允许客户端以某种方式创建库的对象(如下所述),使其不与库的类层次结构紧密耦合。

理解工厂模式

让我们用一个例子来理解它:
工厂方法UML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public abstract class Vehicle
{
public abstract void PrintVerhicleInfo();
}
public class TwoWheeler : Vehicle
{
public override void PrintVerhicleInfo()
{

Console.WriteLine("这是两轮车");
}
}

public class FourWheeler : Vehicle
{
public override void PrintVerhicleInfo()
{
Console.WriteLine("这是四轮车");
}
}

允许使用未经修改的更改进行变基础

如果您希望Git在rebase之前自动保存您未经修改的更改,则可以激活autoStash。在rebase完成后,您的更改将被重新应用。有关解释,git stash请参阅Git中的Stashing更改。

1
git config --global rebase.autoStash true

在Git v2.6 git pull –rebase之前没有尊重这个设置。

用Git修正更正提交的更改

git commit --amend命令可以重做上次提交的更改。它使用调整后的更改创建新提交。

修改后的提交仍然可用,直到清理作业将其删除。但它不包含在git log输出中,因此它不会分散用户的注意力。有关详细信息,请参阅git reflog

假设最后一次提交消息不正确,因为它包含一个拼写错误。以下命令通过--amend参数对此进行更正。

1
2
3
4
# assuming you have something to commit
git commit -m "message with a tpyo here"
# amend the last commit
git commit --amend -m "More changes - now correct"

您应该git --amend仅将命令用于尚未推送到另一个Git存储库的公共分支的提交。该git --amend命令创建一个新的提交ID,人们可能已将其工作基于现有提交。如果是这种情况,他们将需要根据新提交迁移他们的工作。

配置要忽略的文件和目录

使用.gitignore文件忽略文件和目录

可以将Git配置为忽略存储库操作的某些文件和目录。这是通过一个或多个.gitignore文件配置的。通常,此文件位于Git存储库的根目录下,但也可以位于子目录中。在第二种情况下,定义的规则仅对子目录及以下有效。

您可以在此文件中使用某些通配符。*匹配几个字符。可以使用更多模式,并在以下URL中进行描述:gitignore联机帮助页

例如,以下.gitignore文件告诉Git忽略bintarget目录以及以〜结尾的所有文件。

1
2
3
4
5
6
7
8
9
# ignore all bin directories
# matches "bin" in any subfolder
bin/

# ignore all target directories
target/

# ignore all files ending with ~
*~

您可以.gitignore在工作树的根目录中创建该文件,以使其特定于Git存储库。

.gitignore文件告诉Git忽略Git命令中的指定文件。您仍然可以使用参数(即使用命令)将忽略的文件添加到Git存储库的临时区域--forcegit add --force [paths]如果要添加(例如)自动生成的二进制文件,这非常有用,但您需要对添加的版本进行精细控制,并希望将其从正常工作流中排除。

最好将本地.gitignore文件提交到Git存储库中,以便克隆此存储库的每个人都拥有它。

停止基于.gitignore文件跟踪文件

如果将Git跟踪的.gitignore文件添加到文件中,则不会自动删除这些文件。Git永远不会忽略已经跟踪的.gitignore文件,因此文件中的更改只会影响新文件。如果要忽略已跟踪的文件,则需要明确删除它们。

以下命令演示了如何从跟踪中删除.metadata目录和doNotTrackFile.txt文件。这是示例代码,因为您未在示例中提交相应的文件,该命令将无法在您的Git存储库中运行。

1
2
3
4
# remove directory .metadata from git repo
git rm -r --cached .metadata
# remove file test.txt from repo
git rm --cached doNotTrackFile.txt

将文件添加到.gitignore文件不会从存储库历史记录中删除该文件。如果还应从历史记录中删除该文件,请查看git filter-branch允许您重写提交历史记录的命令。有关详细信息,请参阅使用git filter branch命令(filter-branch)

全局(跨存储库).gitignore设置

您还可以.gitignore通过该core.excludesfile设置设置对所有Git存储库有效的全局文件。以下代码段演示了此设置的设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Create a ~/.gitignore in your user directory
cd ~/
touch .gitignore

# Exclude bin and .metadata directories
echo "bin" >> .gitignore
echo ".metadata" >> .gitignore
echo "*~" >> .gitignore
echo "target/" >> .gitignore
# for Mac
echo ".DS_Store" >> .gitignore
echo "._*" >> .gitignore

# Configure Git to use this file
# as global .gitignore

git config --global core.excludesfile ~/.gitignore

全局.gitignore文件仅在本地可用。

本地每个存储库忽略规则

您还可以通过编辑存储库中的.git/info/exclude文件来创建本地每存储库规则。这些规则不会与存储库一起提交,因此不会与其他人共享。

这允许您排除,例如,本地生成的文件。

使用Git跟踪空目录

Git忽略空目录,即它不会将它们置于版本控制之下。如果要跟踪Git存储库中的空目录,最好.gitignore将目录中调用的文件放入。由于目录现在包含一个文件,Git将其包含在其版本控制机制中。

该文件可以被称为任何东西。有人建议调用该文件.gitkeep。这种方法的一个问题是.gitkeep构建系统不太可能忽略它。这可能导致.gitkeep文件被复制到输出存储库,这通常是不希望的。

Git创建新内容

使用以下命令创建几个新文件。

1
2
3
4
5
6
7
8
9
10
# switch to your Git repository
cd ~/repo01

# create an empty file in a new directory
touch datafiles/data.txt

# create a few files with content
ls > test01
echo "bar" > test02
echo "foo" > test03

避免合并提交

默认情况下,如果使用该命令,Git将运行命令git fetch后跟命令。您可以通过以下设置配置git 而不是pull命令。git mergegit pullgit rebasegit merge

1
2
# set default so that you avoid unnecessary commits
git config --global branch.autosetuprebase always

此设置有助于避免在将Git存储库与远程存储库同步的拉取操作期间进行合并提交。此描述的作者始终将此设置用于其Git存储库。

提交.Gitignore文件

.gitignore文件提交到Git存储库是一种很好的做法。为此,请使用以下命令。

1
2
3
4
# add the .gitignore file to the staging area
git add .gitignore
# commit the change
git commit -m "Adds .gitignore file"

通过命令行设置Git

在为命令行安装Git工具之后,您需要配置Git。

使用Git所需的最低信息是Git应该使用的用户名和电子邮件。

您还可以将Git配置为在拉取操作期间使用rebase,这也是Git的常用设置。

通过以下命令为Git配置用户和电子邮件。

1
2
3
4
5
6
7
8
9
10
# configure the user which will be used by Git
# this should be not an acronym but your full name
git config --global user.name "Firstname Lastname"

# configure the email address
git config --global user.email "your.email@example.org"

# use rebase instead of merge in the `git pull` command.
# this avoids merge commits during the pull operation
git config --global branch.autosetuprebase always

更改暂存的文件

如果在提交之前更改其中一个暂存文件,则需要将更改再次添加到暂存区域,以提交新更改。这是因为Git创建了暂存文件内容的快照。必须再次进行所有新的更改。

1
2
3
4
5
# append a string to the test03 file
echo "foo2" >> test03

# see the result
git status

验证新更改尚未暂存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
On branch master

Initial commit

Changes to be committed:
(use "git rm --cached <file>..." to unstage)

new file: datafiles/data.txt
new file: test01
new file: test02
new file: test03

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: test03

将新更改添加到暂存区域。

1
2
# add all files to the index of the Git repository
git add .

git status再次使用该命令可以查看所有更改是否已暂存。

1
2
3
4
5
6
7
8
9
10
11
On branch master

Initial commit

Changes to be committed:
(use "git rm --cached <file>..." to unstage)

new file: datafiles/data.txt
new file: test01
new file: test02
new file: test03
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×