redisめも
download
Redisサーバ起動
> redis-server redis.conf
Redisクライアント起動
> redis-cli
Document
redisドキュメント日本語訳 — redis 2.0.3 documentation Redis
Command
クライアント終了
> exit
内容をdumpしてサーバーを終了
> shutdown
データベースの切り替え
(デフォルトでは0が選択されている)
> select 1
ok
redis[1]>
> select 0
ok
redis>
データ保存
# dump.rbdにDump
> save
# バックでsave
> bgsave
データベースのサイズ確認
> dbsize
(integer) 1
データベースのクリア
# 選択しているdbをクリア
> flushdb
# すべてのdbをクリア
> flushall
バックアップ先
dump.rdb
PHPでredis
Predisを使用 nrk/predis · GitHub
接続
require './autoload.php';
Predis\Autoloader::register();
$client = new Predis\Client('tcp://127.0.0.1:6379');
SET GET
$client->set('key', 'value');
$value = $client->get('key');
echo "$value";
> value
Array
$arr = Array(
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
$client->mset($arr);
$value = $client->mget(array_keys($arr));
var_dump($value);
> array(3) {
[0]=>
string(9) "value1"
[1]=>
string(9) "value2"
[2]=>
string(9) "value3"
}
Set
$client->sadd('testset','a');
$client->sadd('testset','b');
$client->sadd('testset','c');
$value = $client->smembers('testset');
var_dump($value);
> array(3) {
[0]=>
string(1) "b"
[1]=>
string(1) "a"
[2]=>
string(1) "c"
}
Sorted Set
$client->zadd('ranking',100,'user1');
$client->zadd('ranking',200,'user2');
$client->zadd('ranking',150,'user3');
$value = $client->zrank('ranking','user2');
echo "$value";
> 0
Hash
$client->hset('user','name','taro');
$client->hset('user','year','10');
$client->hset('user','sex','male');
$value = $client->hgetall('user');
var_dump($value);
> array(3) {
["name"]=>
string(4) "taro"
["year"]=>
string(2) "10"
["sex"]=>
string(4) "male"
}
MySQL高速化めも
1.コミット頻度を減らす
数千件単位で明示的にcomit
増やしすぎても効果ない
2.バルクインサート
インサート文はまとめて(クエリ長を気にしつつ)
×
INSERT hoge INTO VALUES (1,'a');
INSERT hoge INTO VALUES (2,'b');
...
○
INSERT hoge INTO VALUES (1,'a'),(2,'b'),...
max_allowed_packetを超えない範囲で
3.JOIN
複数テーブルをJOINする場合、期待通りの順番でJOINしてくれない(判断に時間がかかる)場合があるので
STRAIGHT_JOIN で順番を強制する
MySQL のJOIN に関するメモ - Slow Dance
4.EXPLAINでいろいろ見る
漢(オトコ)のコンピュータ道: MySQLのEXPLAINを徹底解説!!
ORDER BY句のキーが多すぎてUsing temporaryになっていたのでキーを減らした
文字列操作
Hiveの文字列操作で使ったUDFメモ
split
split(string str, string pat)
文字列を指定パターンで分割する
|datetime
+--------------------
|2014/07/17 13:30:00
split(datetime,' ')[0]
> 2014/07/17
split(datetime,' ')[1]
> 13:30:00
regexp_replace
regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)
文字列の正規表現で一致した部分を置換する
|date
+---------------------
|2014/07/17
regexp_replace(date,'\/','')
> 20140717
regexp_extract
regexp_extract(string subject, string pattern, int index)
文字列の正規表現で一致した部分を取得する
|date
+----------------------
|2014/07/17
regexp_extract(date,'^([0-9]*)\/',1)
> 2014
LanguageManual UDF - Apache Hive - Apache Software Foundation
GROUP毎の上位N位抽出
MySQLでGROUP BYした時に最初のN件を抽出する方法メモ
How to select the first/least/max row per group in SQL | Xaprb
に載っているユーザ変数を使う方法が簡単そう
テーブル
+----+-------+
| id | chara |
+----+-------+
| 1 | A |
| 2 | C |
| 3 | B |
| 4 | C |
| 5 | B |
| 6 | D |
| 7 | C |
| 8 | D |
| 9 | F |
| 10 | C |
+----+-------+
SET @num := 0, @chara := '';
SELECT
s.chara,
s.id
FROM
(SELECT
id,
chara,
@num := IF(@chara = chara, @num + 1, 1) AS row_number,
@chara := chara AS dummy
FROM test5
ORDER BY chara,id) s
WHERE s.row_number <= 2;
結果
+-------+----+
| chara | id |
+-------+----+
| A | 1 |
| B | 3 |
| B | 5 |
| C | 2 |
| C | 4 |
| D | 6 |
| D | 8 |
| F | 9 |
+-------+----+
ファイル分類
はじめてのpigメモ
複数のファイルから種別毎にファイルを分類する
logfile1
type | message |
---|---|
LOG0001 | MESSAGE1 |
LOG0001 | MESSAGE2 |
... | ... |
LOG0004 | MESSAGE15 |
logfile2 ... 4
pigコマンド
pig -x local
-x local でローカル実行(なしでhadoopモード)
- Pig Latin
ファイルをロード
logfile = LOAD '/home/hadoop/logfile[0-9]'
USING PigStorage('\t') AS (
type:chararray,
message:chararray);
USING PigStorageで区切り文字指定
ASでカラム名の指定
分割
SPLIT logfile
INTO
log1 IF type == 'LOG0001';
SPLIT INTO で条件毎にファイルを分割できる
DUMPで標準出力
DUMP log1;
(LOG0001,Message1)
(LOG0001,Message2)
(LOG0001,Message3)
...
STOREで指定ディレクトリに出力(ファイル名は自動)
STORE log1 INTO 'LOG0001' USING PigStorage();
./ --> LOG0001/ --> part-m-00000
ファイルで実行できる
[pigscript]
logfile = LOAD '/home/hadoop/logfile[0-9]'
USING PigStorage('\t') AS (
type:chararray,
message:chararray);
SPLIT logfile
INTO
log1 IF type == 'LOG0001',
log2 IF type == 'LOG0002',
log3 IF type == 'LOG0003',
log4 IF type == 'LOG0004';
STORE log1 INTO 'LOG0001' USING PigStorage();
STORE log2 INTO 'LOG0002' USING PigStorage();
STORE log3 INTO 'LOG0003' USING PigStorage();
STORE log4 INTO 'LOG0004' USING PigStorage();
# pig -x local -f pigscript
大量INSERT
TableA(1000万件)から100万件をTableBにInsertしたい
・1件ずつコミット
while ($i <= 1000000){
$sql=qq{
insert into TableB select id,str from TableA where id=$i
};
$dbh->do($sql);
$dbh->commit();
$i++;
}
処理時間
16分58秒
・1万件ずつコミット
$dbh->do($sql);
if ( $i % 10000 == 0){
$dbh->commit();
}
処理時間
4分11秒
・10万件
5分11秒
- テストデータ作成
auto incrementで適当にデータを作る
CREATE TABLE HugeTable (
id INT(11) NOT NULL AUTO_INCREMENT,
str VARCHAR(32) NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB
INSERT INTO HugeTable (str)
VALUES ('A'),('B'),('C'),('D'),('E'),('F')
SelectInsertしてふくらます
INSERT INTO HugeTable (str)
SELECT str FROM HugeTable
X n回