みんなの「作ってみた」

月数100万アクセスをDB使わず超簡単にさばく

2018/12/17

Hisashi_vc
Hisashi_vc
じぶんコインという「3秒でコインになれる」プレゼンをあげたり貰ったりして応援者を増やすサービスを、個人で開発しました。 じぶんコイン https://crypto-app.tokyo/qCoin/?m=hisashi_vc

初Qiitaな個人開発者のひさしAppと申します @Hisashi_vc

最近「じぶんコイン」というコイン系SNSサービスを作り、月間100万~数百万アクセスを激安サーバー(1000円ちょい)でさばき中です。

じぶんコイン
https://crypto-app.tokyo/qCoin/?m=hisashi_vc

おまけになかなかの高負荷で、3ヶ月で数百万回送金したり、10連ガチャ回しまくったり、全ユーザーページにチャットあったり、数百人に一斉メッセージ&送金したり、さらに内部API叩きまくってたりと、かなりのヤバさですが、ブロックチェーンどころかデータベース一切使ってません。

そんなツイートしたら予想よりビックリしてもらえたので、種明かししようと思います。ちなみに私はサーバーサイドエンジニアでも何でもないので、Hellow world覚えて3日目の中学生でもできるくら超簡単ですw

この2つでできます!
(ちなみにフレームワークですらない単なるサーバーデフォルトPHP)

1.データのセーブ

//保存先の単なるテキスト。拡張子は何でも良い。これを好きなフォルダに保存。
//ただしファイル名はユニーク名。初回登録連番とか。ツイッターのユニークIDとか
$path = "usersData/user1.csv";

//保存したいユーザーデータのCSV。データ自体に改行や区切り文字は入れない(直前に置換)
$dataStr = "id1,userName1,coinName1,coinCount1";//みたいな

function saveDB_modoki($path, $dataStr, $isLog=false){
    //ファイル無いとWarningになるので一応
    touch($path);
    //ログとかで追記の場合はFILE_APPEND
    file_put_contents($path, $dataStr, ($isLog?FILE_APPEND|LOCK_EX:LOCK_EX));
}

おめでとう!超簡単&&超高速DBもどきへの保存処理はもう完成です!実質4行。
直アクセスで見られたくない場合は、拡張子をphpにしてコメントにデータを書き込むなどしてくださいw

続いてこちら!

2.データのロード

function loadDB_modoki($path,$delim=","){
    $a = file($path);
    for($i=0;$i<count($a);$i++){
        $line = trim($a[$i]);
        if($line){
            $a[$i] = explode($delim,$line);
        }
    }
    return $a;
}

はいもうできた!
何番目に何がはいってるかは覚えておくか、直後に連想配列にパースとかしてください。

これで「準備不要」「予備知識不要」「超簡単」「軽い」「拡張性満点」のDBじゃない処理は完成です!

1点あるとすればロードは軽いですがセーブはロードの数百倍重いので処理しまくるときは注意。とはいっても普通はミリ秒単位なうえ普通のDBより圧倒的に速いはずです。無駄な処理が一切ないので。
ピンとこない人は「csv データベース 速さ」とかで検索してみてね。
CSVが不得手っぽい量の1000万レコードで数十倍~100倍DBよりCSVの方が高速という結果が見れます。さらに言えばそこまで重くなったらどっちにしろキャッシュで対応します。開発速度も数十倍は高速になります。

検索処理やデータ増大対応、処理負荷増大対応についてもまた書きます。もう察しついてそうですがw

こんな感じです!
よかったら「じぶんコイン」がどんなサービスか見てやってください~
ツイッターログインだけで3秒であなたをコイン化。完全無料。半分ネタ。
しかし価値が発生してる不思議なサービス。処理負荷がヤバそうなのも見ればわかります。

じぶんコイン
https://crypto-app.tokyo/qCoin/?m=hisashi_vc