虚拟交易所系统2.0


数据库

1. 用户表

tbl_user

字段 类型 默认值 说明
uuid varchar(36) 主键
name varchar(100) 用户名
password varchar(100) MD5密码
exchangerate double(6,2) 0 交易手续费
createtime varchar(32) 创建时间
status int(3) 0 当前状态 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) 创建时间
remark varchar(255) 说明

3. 持仓表

tbl_holdstock

字段 类型 默认值 说明
uuid varchar(36) 主键
userid varchar(36) 用户ID
stockcode varchar(6) 股票代码
count int(11) 0 持仓数量
lastupdatetime varchar(32) 最后更新时间
useridstockcode varchar(50) 标识 userid_stockcode

4. 交易记录表 每日一张表

tbl_exchangehistoryYYYYMMDD

字段 类型 默认值 说明
uuid varchar(36) 主键
commandid varchar(36) 命令ID
userid varchar(36) 用户ID
stockcode varchar(6) 股票代码
type varchar(20) 类型 buy:买入 sell:卖出
price double(7,3) 0 交易价格
count int(11) 0 交易数量
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) 创建时间

接口

Servlet

1. 创建用户

/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. 获得用户数据

/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. 获得持仓数据

/servlet/getbalanceholdstock

Request:
{
        "userid":"qwertyuioasdfghjkzxcvbnm",          //用户ID
        "stockcode":"601988"                         //股票代码
}
Response:
{
        "statusCode":"000000",
        "result":{
            "userid":"qwertyuioasdfghjkzxcvbnm",
            "stockcode":"601988",
            "balance":"45000",
            "holdcount":"2000"
        }
}

6. 获得股票数据

/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",                /*当前价格*/
            "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. 提现

/servlet/withdrawbalance

Request:
{
        "userid":"qwertyuioasdfghjkzxcvbnm",          //用户ID
        "password":"12345678",                        //密码 6~20位 任意
        "amount":"2.5"                                //提现金额
}
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"                                //买入数量
        "execute":"true",                             //是否真实执行
}
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"                                //买入数量
        "execute":"true",                             //是否真实执行
}
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存储结构

|名称|说明|结构|
|:--|:--:|
|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>|

数据库存储算法

配置文件

配置项 默认值 说明
STOCK_DATA_BASEURL 获得股票大盘数据接口
COMMAND_FILE_ROOT 数据库更新文件夹根目录位置

文件夹

task 为命令任务文件夹 有三种命令 ,分别在三个文件夹中

  1. 创建交易记录 create_exchange 每秒钟一个文件. 追写
  2. 更改用户余额 update_balance 每个用户一个文件 新写
  3. 修改用户股票持仓 update_holdstock 每个用户每只股票一个文件 新写 每次都覆盖之前的记录

update_balance update_holdstock 分别为线程,做了容器ConcurrentHashMap<userid,command>. 每次有新的数据,将覆盖之前的数据

database 为准备入库文件夹 里面每10秒一个文件夹
2017091610452.cmd
2017091610453.cmd
在每个10秒的文件夹中,分别有如下文件

  1. new.db 等待入库文件 这个文件是将最近10秒的文件内容,一并写入到此文件中
  2. process.db 正在入库文件

process.db仅仅是new.db在执行阶段的替身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   #每小时一个文件  这里只有交易记录  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容