最近在 oschina 看到有朋友用 golang 寫了一套 based on HBase 的即時通訊軟體(原設計是 MySQL),而 Qmi 也是基於 HBase 的即時通訊軟體。雖然小編不會寫 golang,但看 code 總還可以的,所以小編當然要來研究一下這個 tim 是如何設計 schema 的。
看起來 rowkey 就是用 HBase 的 increment 指令完成,然後再將 int 轉成 hex 後做為 rowkey。而 family 則有 n 個 (感覺就是欄位名的樣子),然後 family 為 idx 開頭的就是 foreign key。
除了 rowkey 以外,family, qualifier, value 的設計邏輯,更讓小編有點不解 Orz
* 如果 family 是 # 開頭的話 (一般是 # id),則 qualifier 為空,value 為 rowkey 的值
* 如果 family 是 idx_ 開頭,則 family 為 index,qualifier 為欄位的內容 (像是 IndexDomainUsername 的值),value 為空
* 一般欄位則 family 為欄位名稱,qualifier 為空,value 為欄位的內容 (像是 fromuser 的值)
對 HBase 設計比較了解的朋友會知道,rowkey 會影響讀寫的效能,依照 ascii 碼排序,愈分散就愈不會遇到 hotspot,但愈集中一次能取回的資料就愈多,這都是要看 scenario 決定。而 family 與 HFile 成正比,family 愈多,開的檔案愈多,一般建議不超過三個,而這裡一筆 record 就開了十幾個。另外除了 value 以外,naming 要儘量簡短。
看完之後,覺得跟這幾年小編在 HBase 上設計 schema 的原則完全不同啊。不過相信有一部分或許是為了要相容於 RDBMS 的關係,而不得不做的取捨吧 Orz
* https://www.oschina.net/news/78341/tim-1-1-0
* https://github.com/donnie4w/tim/blob/master/tim.hbase/hbaseService.go
* https://github.com/donnie4w/tim/blob/master/tim.hbase/hbasedao.go
* https://github.com/donnie4w/tim/blob/master/doc/hbaseTable.txt
#qmi #tim #hbase #golang
Search
hex轉ascii 在 Re: [問題] ASCII和HEX互轉- 看板C_and_CPP - 批踢踢實業坊 的美食出口停車場
※ 引述《CliffFitter (謎之聲)》之銘言:
: 我想要寫HEX範圍從00~FF轉ASCII的程式和ASCII再轉換回HEX的程式
: EX:61(Hex) -> a(ASCII) -> 61(Hex)
: 兩個都要存成文字檔
: ASCII轉換回HEX的方法是把字元用十六進位方式印出來
: fprintf(dPtr, "%x", Ascii);
: 我發現當HEX為80以上時
: ASCII轉回Hex就會多印6個f 爬文也沒有人問過這個問題
: EX:80(Hex) -> ?(ASCII) -> ffffff80(Hex)
: 在.exe沒有 但是在文字檔會出現
: 請問那6個f是怎麼出現的 要怎麼刪掉呢?
從00到ff測試後 突然發現0a(Hex)轉完後印不出來
0a是換行的意思吧?
不過也是換行的0d卻印的出來
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.177.216
... <看更多>