Weitere ähnliche Inhalte Ähnlich wie Aws×phpでの 高信頼かつハイパフォーマンスなシステム (20) Aws×phpでの 高信頼かつハイパフォーマンスなシステム13. キャッシュの話
キャッシュのスコープと保存方法
1. リクエスト
a. プレイヤーキャッシュ : 変数で保存する
2. サーバ
a. マスターキャッシュ: APCuで保存する
b. コードキャッシュ: OPcacheで保存する
3. 共通
a. マスターキャッシュ: ElastiCache(Redis)で保存する
b. ランキング: ElastiCache(Redis)で保存する
c. その他のキャッシュ: ElastiCache(Redis)で保存する
15. マスターデータのキャッシュの話
version: v2
master_card-v2: {...}
master_music-v2: {...}
master_card-v3: {...}
master_music-v3: {...}
ElastiCacheAPI Server
API Server
APCu
master_music-v2
APCu
master_music-v2
master_card-v2
Req
1 GET
version
2 GET
master_card-v2
3 GET
master_card-v2
4 SET
master_card-v2
1 GET
version
2 GET
master_card-v2
Req
17. マスターデータのキャッシュの話
キャッシュのフォーマットの比較
環境: PHP7, OS: CentOS 6.5, CPU: 1core, memory: 1GB
マスターデータ: カードマスター, 27カラム, 1000レコード
Serializeが約3倍に速い!Serializeのほうが良い理由は速さだけじゃない。
JSON Serialize
エンコード(1000回) 2.16s 0.86s
デコード(1000回) 4.83s 1.76s
メモリサイズ 608KB 692KB
20. プレイヤーデータのキャッシュ
● DBへのアクセス回数を減らしたい
○ 取得データのキャッシュ
■ 同一レコードは1回目は DBからデータを取得、2回目以降はキャッシュから取得
○ 保存情報をまとめるため追加・更新・削除データのキャッシュ
■ 同一レコードを修正しても、キャッシュを利用し保存クエリは 1回のみ発行
● リクエストの最後で初めて更新処理を実行したい
○ 途中でエラーになった際余分なロールバックをさせたくない
■ 仮想通貨は基板側で持っておりロールバックできないため、クエリ保存 ->仮想通貨の消
費・増加->コミットという順番で行いたい
30. スプレットシートからDDLの自動生成
自動化・自動生成の話
drop table if exists player_main_episode cascade;
create table player_main_episode (
player_id int(10) unsigned NOT NULL comment 'プレイヤーID',
main_episode_id int(10) unsigned NOT NULL comment 'エピソードID',
read_flg tinyint(3) unsigned NOT NULL comment '既読フラグ 0: 未読,1: 既読
',
created_at datetime comment '作成日',
updated_at datetime comment '更新日',
deleted_at datetime default null comment '削除日 セットされるとレコード削除
扱い',
constraint player_main_episode_PKC primary key
(player_id,main_episode_id)
)
comment 'プレイヤーメインエピソード ' ENGINE=InnoDB DEFAULT
CHARSET=utf8mb4
partition by linear hash (player_id) partitions 16;
'
31. 自動化・自動生成の話
DBのスキーマからModelクラスの自動生成
class Model_Db_PlayerMainEpisode extends Model_OwnPlayer
{
protected static $_table_name = 'player_main_episode';
protected static $_primary_key = ['player_id', 'main_episode_id'];
protected static $_properties = [
'player_id' => [
'schema' => [
'data_type' => 'int',
'constraint' => 10,
'unsigned' => true,
'null' => false,
'comment' => 'プレイヤーID',
],
'validation' => [
'required',
'numeric_min' => [0],
'numeric_max' => [4294967295]
]
],
'main_episode_id' => [
'schema' => [
'data_type' => 'int',
'
34. 自動化・自動生成の話
DBのJsonSchemaからクライアントのクラスを自動生成
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "definitions/player/characterpresent.json",
"title": "MainEpisodeInfo",
"type": "object",
"properties": {
"MainEpisodeId": {
"type": "integer",
"description": "メインエピソードID"
},
"ReadFlg": {
"type": "integer",
"description": "0:未読, 1:既読"
}
},
"keys": ["MainEpisodeId"],
"required": ["MainEpisodeId", "ReadFlg"]
}
using System;
using System.Collections.Generic;
namespace XXX
{
/// <summary>
/// No document
/// </summary>
[Serializable]
public class MainEpisodeInfo : PlayerInfoBase<MainEpisodeInfo>
{
/// <summary>
/// メインエピソードID
/// </summary>
public int MainEpisodeId { get; set; }
/// <summary>
/// 0:未読, 1:既読
/// </summary>
public int ReadFlg { get; set; }
}
}
48. Zephir vs PHP7
ハイパフォーマンスPHP
PHP5.6 Zephir PHP7
each(1,000,000) 470ms 167ms 105ms
without(1,000,000) 4800ms 90ms 40ms
search(1,000,000) 30ms 20ms 20ms
repeat(1,000,000) 80ms 10ms 10ms
フィボナッチ数列(38) 16s 23s 9s
検証環境
OS: CentOS 6.5 (vagrant) CPU: 1core
Memory: 1GB PHP: nginx × PHP-FPM × OPcache
実行速度はPHP7 ≧ Zephir > > > PHP5.6