当我们
执行一次MySQL数据库表的
操作,我们将不依赖MySQL的自动增量产生的唯一ID,因为数据已经被分散到多个表。 U3000 U3000
避免使用自增ip作为主密钥,给数据库表操作带来很大不便。
有一种特殊的特征---序列,在PostgreSQL,Oracle,DB2数据库。随时可以获取数据库记录数下表根据当前表的记录数和步长。然而,MySQL没有这样的序列对象。
以下
方法可用于实现序列特征的唯一id:
1。通过MySQL表生成id
对于插入,即插入操作,第一件事是获得唯一ID。它需要一个表来
创建id,插入一个记录并获得最后一个插入ID:
创建表(` ttlsa_com ` ` create_id `。
` ID ` bigint(20)不为空auto_increment主键
MyISAM引擎=)
也就是说,当我们需要插入数据时,我们必须从这个表中生成id值,而我的PHP代码如下所示:
< PHP
功能get_ai_id(){
为SQL =插入create_id(ID)值(' ');
$ $ > DB >
查询($ SQL);
返回这个->数据库->插();
}
>
这种方法效果很好,但在高并发
情况下,MySQL的auto_increment将导致整个数据库将是缓慢的。如果有一个自增字段,MySQL会保持一个自增锁。InnoDB将存储在
内存计数器记录auto_increment价值。当插入新行数据时,将使用一个表锁来锁定计数器直到插入结束。如果插入行和行,没有问题,但在高度并发的情况下,它将是悲伤的。表锁会导致SQL堵塞,这将大大
影响性能和max_connections价值。
innodb_autoinc_lock_mode:您可以
设置3个值:0, 1, 2。
0:传统(每次产生一个表锁)
1:
连续(
默认情况下,当我们预测行数时,我们可以使用新的方法。我们使用新方法时不能使用表锁。对于简单的插入,我们可以获得批
处理锁并确保连续插入。
2:交错(不会锁定表,一个处理一个,最高并发)
MyISAM表是传统的
发动机,和表锁是每一次。
2。通过使用生成的ID
功能get_next_autoincrement_waitlock($超时= 60){
$ = $超时> 0 $超时:60;
当($)-获取(串行:锁){
数+;
睡眠(1);
如果(计数10)
返回false;
}
返回true;
}
功能get_next_autoincrement($超时= 60){
检查我们是否被锁定…
如果(get_next_autoincrement_waitlock($超时)= false)
返回0;
ID = $ R美元-> incr(串行);
如果($ 1)
返回$ id;
如果为1,我们假设没有串行键…
我们需要上锁。第一
如果($ R > setnx(系列:锁),1){
$过期>(串行:锁定
从数据库中获取最大值(id)。
$id = select_db_query(选择MAX(ID)从user_posts );
或者:
选择ID由 / ID DESC LIMIT 1阶user_posts
增加
美元+ +;
redis键 / /更新
设置()串行
锁释放
$;
返回$ id;
}
得不到锁。/ / can
返回0;
}
$ R =新的Redis();
$ R ->
连接(127.0.0.1
ID = get_next_autoincrement(美元);
如果($){
为SQL =插入user_posts(ID,
用户信息)值($id,' $用户,' $
消息)。
数据exec_db_query美元($ SQL);
}
三.队列
模式 事实上,这是上述解释之一。
使用队列
服务,比如redis,memcacheq等,将一定量的ID预分配一个队列,每个插入操作,从队列中获取一个ID,如果插入失败,身份再次添加到队列中,同时监测队列数,当小于阈值自动添加元素的队列。
这样你可以分配ID的计划,会带来经济效应,如QQ号码,各种漂亮的
日期,价格标签,如用户ID的
网站,允许UID登陆,推出各种美丽的日期,价格,扰乱普通ID后随机分配。
< PHP
公共类{
私人股本;
函数构造(){
美元-> __construct();
}
公共功能__construct(){
美元-> R =新的Redis();
美元-> R ->连接('127.0.0.1 ',6379);
}
功能set_queue_id($ IDS){
如果(is_array($ IDS)isset($ IDS)){
foreach($ IDS为$id){
美元-> R - LPUSH('next_autoincrement,$id);
}
}
}
功能get_next_autoincrement(){
返回这个> R > LPOP('next_autoincrement);
}
}
$ createId =阵();
而(计数($ createId)<20){
$ =兰德(10004000);
如果(!in_array($num,createId美元))
{ } = $num createId美元;
}
$ =新通用();
$id -> set_queue_id($ createId);
var_dump($id -> get_next_autoincrement());
监视队列的数量,自动添加队列并获取ID,但不要使用它们。
以上是本文的全部内容,希望能对您有所帮助,希望大家多多
支持。