php zend Lucene pagination
1月 24th, 2012
http://framework.zend.com/manual/1.11/en/learning.lucene.pagination.html
なんとなくコメントが面白いので。
検索結果のidだけキャッシュしておいて
次ページのときは、idからデータを取得しろというだけですが
この結果のインスタンスのサイズが半端ないので、全部キャッシュするのは無理です。
とりあえず、速度だけ計ってみました。
getDocument 100回
0.10254192352295 sec
0.093567132949829
0.091049194335938
search + 100データ取得 + 1000idをcache
0.86610412597656 sec
0.6905689239502
0.69413304328918
ということで、検索は、キーワードやデータ量でかなり変わりますが、getdocument100回のほうが速いことは分かりました。
ページングとキャッシュを実装しました。
基本的には、ページング以外にキャッシュが利用されることは稀なので、memcachedのメモリは少なめに設定です。
Redis + predis | memcachedの代わりにRedisを使ってみる。
1月 20th, 2012
http://redis.io
http://redis.io/clients
memcachedを利用していた表示データをredisにしてみます。
消えても良いのですが、データが出来るまで寂しいので。
daily rankingやpublic activityとか
*永続的なmemachedですが、メモリーサイズより大きいデータは扱えないので、あくまでもmemcachedの代替。Virtual Memory機能はあるが非推奨。
1. redis install
# yum list redis
redis.x86_64 2.0.3-2.el5 [...]
tokyotyrant backup | tcrmgr copy
1月 12th, 2012
http://alpha.mixi.co.jp/blog/?p=147
# tcrmgr copy -port 1978 localhost /tmp/backup.tch
ホットコピーできるので、mysqldumpよりも楽です。
* ulogも入れておきましょう。
* 更新しない物は、コピーだけでOK
こんな感じで簡単なスクリプト
#!/bin/sh
copy_tt()
{
# 1 output_file 2 port
tcrmgr copy -port ${2} localhost ${1}
}
SRC_IP=’333.333.333.333′
SRC_DIR=”/home/bkup/data/bkup/tt/servicename”
TO_IP=’99.99.99.99′
TO_DIR=”/home/bkup/data/${SRC_IP}/tt/servicename”
mkdir -p ${SRC_DIR}
copy_tt “${SRC_DIR}/a.tch” 51101
copy_tt “${SRC_DIR}/b.tch” 51102
ssh ${TO_IP} mkdir -p ${TO_DIR}
rsync -auz ${SRC_DIR}/ ${TO_IP}:${TO_DIR}/
mysql buckup | mysqlhotcopy or mysqldump
1月 12th, 2012
http://dev.mysql.com/doc/refman/5.5/en/backup-methods.html
http://dev.mysql.com/doc/refman/5.5/en/mysqlhotcopy.html
mysqlhotcopyしようと思ったらinnodbでは使えないとのこと。
#!/bin/sh
SRC_IP=’000.000.000.000′
SRC_DIR=”/home/bkup/data/bkup/mysql”
TO_IP=’1.1.1.1′
TO_DIR=”/home/bkup/data/${SRC_IP}/mysql”
DATESTR=`date ‘+%Y%m%d%H%M%S’`
MYSQL_NAME=’wordpress’
# test touch /home/bkup/data/bkup/mysql/db.$DATESTR
# touch /home/bkup/data/bkup/mysql/db.${DATESTR}
mkdir -p ${SRC_DIR}
# mysqldump -u root –all-databases > ${SRC_DIR}/${MYSQL_NAME}.${DATESTR}
# gzip ${SRC_DIR}/${MYSQL_NAME}.${DATESTR}
ssh ${TO_IP} mkdir -p ${TO_DIR}
CMD_STR=”rsync -auz ${SRC_DIR}/${MYSQL_NAME}.${DATESTR}.gz ${TO_IP}:${TO_DIR}/${MYSQL_NAME}.${DATESTR}”
$CMD_STR
こんな感じで。dumpしてrsync
sqlite backup .dump
1月 11th, 2012
3.3.6には.backupコマンドが無いようで
.dumpで取るのかな?
定期コピーと定期dumpでやってみようと思います。
コピーは普通にコピーするだけ
dumpはこんな感じ。
$ sqlite3 data/sqlite/def .dump > data/sqlite/def.bakcup
restoreしてみる。
$ sqlite3 data/sqlite/def.restore < data/sqlite/def.bakcup
簡単で良いですね。これで数日分バックアップしておきます。
sqlite | id generator
1月 11th, 2012
他のデータは扱わず、ユーザーIDだけ管理するサービスは、sqliteのautoincrementを利用してID生成してみる。
sqlite使ったことが無いので、適当。。。
http://www.sqlite.org/sqlite.html
$ sqlite3 filename
これでデータベースできるみたい。
$ sqlite3 data/sqlite/def
SQLite version 3.3.6
Enter “.help” for instructions
sqlite> .databases
seq name file
— ————— ———————————————————-
0 main /home/opt/home/socialic.tarot/data/sqlite/def
* create table
sqlite> create table users(
[...]
PDOのdsnにcharset が必要だった。|mysql php
12月 26th, 2011
mysql:host=slave.mysql.tranode.com;dbname=tranode;port=99999;charset=utf8;
みたいな。
charsetを指定しないと文字化けした。phpからだけ見てるとわからないけど
mysqlから直接見ると文字化けしてたので、文字コードが間違えて入ってるっぽい。
skip slave sql error | mysql
12月 15th, 2011
slaveでsqlエラーが出ると
mysql > show slave status;
Slave_IO_Running: Yes
Slave_SQL_Running: No
–
Last_Errno:
Last_Error: Error ‘xxx’
となりました。
(原因はいろいろですが、単純な場合は、slave側でstart slaveの前に何かsqlを実行してそれが邪魔しているとか
飛ばしても良いエラーの場合は、
stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
start slave;
でスキップします。
====
データがある状態からstart slaveするときは。
master のポジションを確認
FLUSH TABLES WITH READ LOCK; // マスターの書き込みを停止。& dump & copy
show master status; // file positionを確認
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000001 | [...]
can not use current_timestamp on 2 timestamp columns | mysql
12月 14th, 2011
create table でこれがエラーになる。
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
http://dev.mysql.com/doc/refman/5.5/en/timestamp.html
あってそうだけど、2個 timestamp型にCURRENT_TIMESTAMPを使えないらしい。
テーブル内の1つの TIMESTAMP カラムに対して、現在のタイムスタンプをデフォルト値と自動更新値として指定する事ができます。現在のタイムスタンプを、カラムを初期化するデフォルト値にする事、または自動更新のデフォルト値にする事、またはその両方にする事が可能です。現在のタイムスタンプを、1つのカラムを初期化するデフォルト値にし、別のカラムの自動更新のデフォルト値にする事は不可能です。
ということで。
`created_at` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00′,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
instert into で NOW() を入れてみる。
mysql> select * from users;
+———+——–+——+———-+———————+———————+
| id | authid | mail | [...]
generate id by procedure | mysql
12月 14th, 2011
作成時は、delimiter // で ; を変えておく必要があります。
autoincrementのIDを作成して返します。
mysql > delimiter //
CREATE PROCEDURE check_user (IN s_id VARCHAR(255), OUT r_id INT(11))
BEGIN
SELECT id INTO r_id FROM users WHERE authid=s_id;
IF r_id is NULL THEN
INSERT INTO users( authid ) values( s_id );
SELECT id INTO r_id [...]