對於mysql的全域性id(主鍵),我們一般採用自增整數列、程式生成guid、單獨的表作為id生成器,這幾種方案各有優劣,最終效率都不能說十分理想(尤其海量資料下),其實通過redis的incr可以很方便生成自增數,因為是操作快取,生成的效率也不錯。
插入資料庫的主鍵也是連續增長的,配合索引,讀取效率也很高。
下面是從redis中獲取新的自增數的**:
public我的專案用的repository模式,所以獲取新主鍵的方法我寫到repository父類中(在介面irepository中有定義),這樣各個repository可以過載屬性tablename,當然你完全可以把newidentity獨立出去作為公共方法,只要傳入tablename即可sealed
class
utils
return (int
)value;}}
}
public下面是測試**,並且用stopwatch測試每次執行效率:abstract
class
repositorybase : irepository
protected
virtual
string tablename
public
virtual
intnewidentity()
.id"; //
eg. sequence_lottery.id, sequence_player.id
var id = utils.newsequencefromredis(rediskey, () =>);
return
id; }
}
using (var ctx = di.resolve())執行結果如下,除第一次獲取主鍵開銷98毫秒(估計建立redis連線有關),後面的幾乎都是0毫秒(redis本來就飛快,這裡不用考慮資料庫連線開閉的時間消耗), elapsed: ms
", userid, sw.elapsedmilliseconds);
sw.restart();
var gameid = ctx.resolve().newidentity();
sw.stop();
console.writeline(
"gameid=, elapsed: ms
", gameid, sw.elapsedmilliseconds);
sw.restart();
var roomid = ctx.resolve().newroomidentity();
sw.stop();
console.writeline(
"roomid=, elapsed: ms
", roomid, sw.elapsedmilliseconds);
sw.restart();
var betitemid = ctx.resolve().newbetitemidentity();
sw.stop();
console.writeline(
"betitemid=, elapsed: ms
", betitemid, sw.elapsedmilliseconds);
sw.restart();
var lotteryid = ctx.resolve().newidentity();
sw.stop();
console.writeline(
"lotteryid=, elapsed: ms
", lotteryid, sw.elapsedmilliseconds);
//省略的**。。。
}
檢視redis中的鍵值:
當然,**還需要完善,比如redis掛了的情況,id主鍵可以讀取max(id)+1來替代主鍵生成,但是redis又恢復後,自增數怎麼同步
Django ORM框架 生成資料表
databases 需要注意的是,django連線sql需要安裝mysqlclient模組。進入虛擬環境,輸入命令pipenv install mysqlclient。我們先使用django自帶的sqlite3資料庫來學習。不需要修改配置檔案。資料庫 需要手動建立資料庫 資料表 與orm中的模型類 ...
根據Django Model動態生成資料表的方法
當定義好django model後,一般可以在初始化呼叫syncdb方法來自動在資料庫裡面生成相應的表。那麼如果想在後續階段想根據根據django model動態生成資料表,該怎麼辦呢?要生成資料庫表,就得先根據model的定義先生成sql語句,然後在資料庫裡面執行。並且由於要支援不同的資料庫,所生...
SQL取資料表主鍵
1 select table name,column name from information schema.key column usage where table name dtproperties 2 exec sp pkeys table name 表名 3 select o.name a...