數(shù)據(jù)庫
1. 用戶表
tbl_user
字段 | 類型 | 默認值 | 說明 |
---|---|---|---|
uuid | varchar(36) | 主鍵 | |
name | varchar(100) | 用戶名 | |
password | varchar(100) | MD5密碼 | |
exchangerate | double(6,2) | 0 | 交易手續(xù)費 |
createtime | varchar(32) | 創(chuàng)建時間 | |
status | int(3) | 0 | 當(dāng)前狀態(tài) 0:正常 2:異常 |
2. 余額表
tbl_balance
字段 | 類型 | 默認值 | 說明 |
---|---|---|---|
uuid | varchar(36) | 主鍵 | |
userid | varchar(36) | 用戶ID | |
balance | double(11,3) | 0 | 賬戶余額 |
lastupdatetime | varchar(32) | 最后更新時間 |
3. 充值表
tbl_recharge
字段 | 類型 | 默認值 | 說明 |
---|---|---|---|
uuid | varchar(36) | 主鍵 | |
userid | varchar(36) | 用戶ID | |
amount | double(11,3) | 0 | 充值金額 |
createtime | varchar(32) | 創(chuàng)建時間 | |
remark | varchar(255) | 說明 |
3. 持倉表
tbl_holdstock
字段 | 類型 | 默認值 | 說明 |
---|---|---|---|
uuid | varchar(36) | 主鍵 | |
userid | varchar(36) | 用戶ID | |
stockcode | varchar(6) | 股票代碼 | |
count | int(11) | 0 | 持倉數(shù)量 |
lastupdatetime | varchar(32) | 最后更新時間 | |
useridstockcode | varchar(50) | 標識 userid_stockcode |
4. 交易記錄表 每日一張表
tbl_exchangehistoryYYYYMMDD
字段 | 類型 | 默認值 | 說明 |
---|---|---|---|
uuid | varchar(36) | 主鍵 | |
commandid | varchar(36) | 命令I(lǐng)D | |
userid | varchar(36) | 用戶ID | |
stockcode | varchar(6) | 股票代碼 | |
type | varchar(20) | 類型 buy:買入 sell:賣出 | |
price | double(7,3) | 0 | 交易價格 |
count | int(11) | 0 | 交易數(shù)量 |
exchangeamount | double(11,3) | 0 | 交易稅金額 |
stockamount | double(11,3) | 0 | 股票金額 |
totalamount | double(11,3) | 0 | 交易總金額 |
holdstockbefore | int(11) | 0 | 交易前持倉 |
holdstockafter | int(11) | 0 | 交易后持倉 |
balancebefore | double(11,3) | 0 | 交易前余額 |
balanceafter | double(11,3) | 0 | 交易后余額 |
createtime | varchar(32) | 創(chuàng)建時間 |
接口
Servlet
1. 創(chuàng)建用戶
/servlet/createuser
Request:
{
"name":"15901197623", //用戶名 手機號 中文英文
"password":"12345678", //密碼 6~20位 任意
"exchangerate":"2.5" //交易費率
}
Response:
{
"statusCode":"000000",
"result":{
"uuid":"qwertyuioasdfghjkzxcvbnm",
"name":"15901197623",
"password":"12345678",
"exchangerate":"2.5",
"createtime":"2017-07-02 14:34:33",
"status":"0"
}
}
2. 檢查用戶名密碼
/servlet/checkuser
Request:
{
"name":"15901197623", //用戶名 手機號 中文英文
"password":"tyuiotrthfkghjhkfhgjhkjtyui", //密碼 可以是明文也可以密文
}
Response:
{
"statusCode":"000000",
"result":{
"uuid":"qwertyuioasdfghjkzxcvbnm",
"name":"15901197623",
"password":"12345678",
"exchangerate":"2.5",
"createtime":"2017-07-02 14:34:33",
"status":"0"
}
}
3. 檢查密碼
/servlet/checkpassword
Request:
{
"userid":"qwertyuioasdfghjkzxcvbnm", //用戶ID
"password":"12345678" //密碼 可以是明文也可以密文
}
Response:
{
"statusCode":"000000",
"result":"ok"
}
4. 獲得用戶數(shù)據(jù)
/servlet/getuserdata
Request:
/servlet/getuserdata?userid=qwertyuioasdfghjkzxcvbnm
Response:
{
"statusCode":"000000",
"result":{
"userid":"qwertyuioasdfghjkzxcvbnm",
"name":"15901197623",
"exchangerate":"2.5",
"balance":"45000",
"stockdata":[
{
"uuid":"fdaserqrewrqewrdgqeterqwe",
"userid":"qwertyuioasdfghjkzxcvbnm",
"stockcode":"601988",
"count":"2000",
"lastupdatetime":"2017-07-12 12:33:33",
"useridstockcode":"qwertyuioasdfghjkzxcvbnm_601988"
},
……
]
}
}
5. 獲得持倉數(shù)據(jù)
/servlet/getbalanceholdstock
Request:
{
"userid":"qwertyuioasdfghjkzxcvbnm", //用戶ID
"stockcode":"601988" //股票代碼
}
Response:
{
"statusCode":"000000",
"result":{
"userid":"qwertyuioasdfghjkzxcvbnm",
"stockcode":"601988",
"balance":"45000",
"holdcount":"2000"
}
}
6. 獲得股票數(shù)據(jù)
/servlet/getstockdata
Request:
/servlet/getstockdata?stockcode=601988
}
Response:
{
"statusCode":"000000",
"result":{
"gid":"sh601009", /*股票編號*/
"increPer": "9.91", /*漲跌百分比*/
"increase": "43.99", /*漲跌額*/
"name":"南京銀行", /*股票名稱*/
"todayStartPri":"8.26", /*今日開盤價*/
"yestodEndPri":"8.26", /*昨日收盤價*/
"nowPri":"8.37", /*當(dāng)前價格*/
"todayMax":"8.55", /*今日最高價*/
"todayMin":"8.25", /*今日最低價*/
"competitivePri":"8.37", /*競買價*/
"reservePri":"8.38", /*競賣價*/
"traNumber":"34501453", /*成交量*/
"traAmount":"290889560", /*成交金額*/
"buyOne":"10870", /*買一*/
"buyOnePri":"8.37", /*買一報價*/
"buyTwo":"177241", /*買二*/
"buyTwoPri":"8.36", /*買二報價*/
"buyThree":"92600", /*買三*/
"buyThreePri":"8.35", /*買三報價*/
"buyFour":"87200" /*買四*/
"buyFourPri":"8.34", /*買四報價*/
"buyFive":"113700", /*買五*/
"buyFivePri":"8.42", /*買五報價*/
"sellOne":"47556", /*賣一*/
"sellOnePri":"8.38", /*賣一報價*/
"sellTwo":"103057", /*賣二*/
"sellTwoPri":"8.39", /*賣二報價*/
"sellThree":"186689", /*賣三*/
"sellThreePri":"8.40", /*賣三報價*/
"sellFour":"49000", /*賣四*/
"sellFourPri":"8.41", /*賣四報價*/
"sellFive":"214535", /*賣五*/
"sellFivePri":"15.21", /*賣五報價*/
"date":"2012-12-11", /*日期*/
"time":"15:03:06", /*時間*/
}
}
7. 充值
/servlet/rechargebalance
Request:
{
"userid":"qwertyuioasdfghjkzxcvbnm", //用戶ID
"password":"12345678", //密碼 6~20位 任意
"amount":"1002.5" //充值金額
}
Response:
{
"statusCode":"000000",
"result":{
"uuid":"fdas6fdsa6f5dsa5f536adsf3ad5ads",
"userid":"qwertyuioasdfghjkzxcvbnm",
"balance":"46002.5",
"lastupdatetime":"2017-06-11 12:34:33"
}
}
8. 提現(xiàn)
/servlet/withdrawbalance
Request:
{
"userid":"qwertyuioasdfghjkzxcvbnm", //用戶ID
"password":"12345678", //密碼 6~20位 任意
"amount":"2.5" //提現(xiàn)金額
}
Response:
{
"statusCode":"000000",
"result":{
"uuid":"fuytrurtyurtyurtsfgfdsyurtyuyetrytr",
"userid":"qwertyuioasdfghjkzxcvbnm",
"balance":"46000",
"lastupdatetime":"2017-06-11 12:38:33"
}
}
9. 買入股票
/servlet/buystock
Request:
{
"userid":"qwertyuioasdfghjkzxcvbnm", //用戶ID
"password":"12345678", //密碼 6~20位
"stockcode":"601988", //股票代碼
"count":"1000" //買入數(shù)量
"execute":"true", //是否真實執(zhí)行
}
Response:
{
"statusCode":"000000",
"result":{
"uuid":"dafadsfdagvcthtrygdsfgsdg",
"commandid":"",
"userid":"qwertyuioasdfghjkzxcvbnm",
"stockcode":"601988",
"type":"buy",
"price":"7.12",
"count":"1000",
"holdstockbefore":"0",
"holdstockafter":"1000",
"balancebefore":"46000",
"balanceafter":"38862.2",
"exchangeamount":"17.8",
"stockamount":"7120",
"totalamount":"7137.8",
"createtime":"2017-06-13 14:28:31"
}
}
10. 買出股票
/servlet/sellstock
Request:
{
"userid":"qwertyuioasdfghjkzxcvbnm", //用戶ID
"password":"12345678", //密碼 6~20位
"stockcode":"601988", //股票代碼
"count":"1000" //買入數(shù)量
"execute":"true", //是否真實執(zhí)行
}
Response:
{
"statusCode":"000000",
"result":{
"uuid":"kljhvcbyujewvdcjhwofiuldvklc",
"commandid":"",
"userid":"qwertyuioasdfghjkzxcvbnm",
"stockcode":"601988",
"type":"sell",
"price":"7.12",
"count":"1000",
"holdstockbefore":"0",
"holdstockafter":"1000",
"balancebefore":"38862.2",
"balanceafter":"45964.4",
"exchangeamount":"17.8",
"stockamount":"7120",
"totalamount":"7102.2",
"createtime":"2017-06-13 15:18:32"
}
}
11. 批量操作命令
/servlet/batchcommand
Request:
{
"12321df43refd45refd4":{
"type":"balance",
"userid":"qwertyuioasdfghjkzxcvbnm",
"password":"12345678",
},
"oi89vfadsnq4irdadaf78":{
"type":"holdstock",
"userid":"qwertyuioasdfghjkzxcvbnm",
"password":"12345678",
"stockcode":"601988"
},
"54786fdasfas6d8f57fa":{
"type":"balance&holdstock",
"userid":"qwertyuioasdfghjkzxcvbnm",
"password":"12345678",
"stockcode":"601988"
},
"dfaoiusfads68afsdljfdas":{
"type":"buy",
"commandid":"fdfidsapo68fsadhifads",
"userid":"qwertyuioasdfghjkzxcvbnm",
"stockcode":"601988"
"count":"1000"
},
"7a89f0ds576fadsfasd987":{
"type":"sell",
"commandid":"dfasiuy687sfdadfasdfasd",
"userid":"qwertyuioasdfgffhjkzxcvbnm",
"password":"12345678",
"stockcode":"601988"
"count":"1000"
}
}
Response:
{
"statusCode":"000000",
"result":{
"12321df43refd45refd4":{
"userid":"qwertyuioasdfghjkzxcvbnm",
"balance":"45964.4"
},
"oi89vfadsnq4irdadaf78":{
"userid":"qwertyuioasddfghjkzxcvbnm",
"stockcode":"601988"
"holdcount":"1000"
},
"54786fdasfas6d8f57fa":{
"userid":"qwertyuioasdfghjkzxcvbnm",
"stockcode":"601988"
"holdcount":"1000",
"balance":"45964.4"
},
"dfaoiusfads68afsdljfdas":{
"userid":"qwertyuioasdfghdjkzxcvbnm",
"stockcode":"601988"
"count":"1000"
},
"7a89f0ds576fadsfasd987":{
"userid":"qwertyuioasdfdghjkzxcvbnm",
"stockcode":"601988"
"count":"1000"
}
}
}
Cache存儲結(jié)構(gòu)
|名稱|說明|結(jié)構(gòu)|
|:--|:--:|
|cachekey_user|用戶集合|Map<userid,UserMap>|
|cachekey_user_name|用戶名集合|Map<username,UserMap>|
|cachekey_balance|余額集合|Map<balanceid,BalanceMap>|
|cachekey_balance_userid|用戶余額集合|Map<userid,BalanceMap>|
|cachekey_holdstock|持倉集合|Map<holdstockid,HoldstockMap|
|cachekey_holdstock_userid|用戶持倉集合|Map< userid,HoldstockMapList>|
數(shù)據(jù)庫存儲算法
配置文件
配置項 | 默認值 | 說明 |
---|---|---|
STOCK_DATA_BASEURL | 獲得股票大盤數(shù)據(jù)接口 | |
COMMAND_FILE_ROOT | 數(shù)據(jù)庫更新文件夾根目錄位置 |
文件夾
task
為命令任務(wù)文件夾 有三種命令 竿痰,分別在三個文件夾中
- 創(chuàng)建交易記錄
create_exchange
每秒鐘一個文件. 追寫 - 更改用戶余額
update_balance
每個用戶一個文件 新寫 - 修改用戶股票持倉
update_holdstock
每個用戶每只股票一個文件 新寫 每次都覆蓋之前的記錄
update_balance
update_holdstock
分別為線程碎浇,做了容器ConcurrentHashMap<userid,command>. 每次有新的數(shù)據(jù),將覆蓋之前的數(shù)據(jù)
database
為準備入庫文件夾 里面每10秒一個文件夾
2017091610452.cmd
2017091610453.cmd
在每個10秒的文件夾中洽蛀,分別有如下文件
-
new.db
等待入庫文件 這個文件是將最近10秒的文件內(nèi)容,一并寫入到此文件中 -
process.db
正在入庫文件
process.db僅僅是new.db在執(zhí)行階段的替身rename
history
為入庫歸檔文件夾 每小時一個文件夾
2017091610.cmd 這里只有create_exchange
命令需要存儲
文件夾示例
[-]/CacheFile/TradeCommand
[-]task
[-]create_exchange.cmd #每秒一個文件
[-]20170916104523.cmd
[-]20170916104524.cmd
[-]20170916104525.cmd
[-]20170916104526.cmd
[-]update_holdstock.cmd #每用戶一個文件
[-]fdardashj23hh324jlk324ghj.cmd
[-]sdaffad89s7fdjash32u4342j.cmd
[-]fda9fds9a8h2i4342ifjdu342j.cmd
[-]update_balance.cmd #每用戶每只股票一個文件
[-]fdardashj23hh324jlk324ghj_601988.cmd
[-]sdaffad89s7fdjash32u4342j_601988.cmd
[-]sdaffad89s7fdjash32u4342j_601931.cmd
[-]sdaffad89s7fdjash32u4342j_602483.cmd
[-]fda9fds9a8h2i4342ifjdu342j_601988.cmd
[-]database
[-]create_exchange.cmd #每10秒一個文件
[-]2017091610452.cmd
[-]update_holdstock.cmd #每10秒一個文件
[-]2017091610452.cmd
[-]update_balance.cmd #每10秒一個文件
[-]2017091610452.cmd
[-]history
[-]2017091610.cmd #每小時一個文件 這里只有交易記錄