解決 memcache race condition 的問題

解決辦法就是避免所有的 query 集中在那個 expire 時間點上 , 那該 user 的方法是每次的 get 時加上一個亂數的時間差 .

http://www.alexhopmann.com/2008/06/13/memcache-race-condition-fun/

memcache 的作者認為, user “不應該” 關心他的資料為什麼不再 memcache 裡 , 就算是 memcache server 都關掉, 都不能影響程式的進行, 頂多程式變慢而已.

[code language=’php’]
$key=’key’;
$obj = $memcache->get($key);
if ( $obj==NULL ) {
$obj = Get_obj_from_table();
$memcache->set($key, $obj, $expire);
}
[/code]

測試心得是:

  • 如果 memcached server 的 memory 滿了, 他的 bytes / curr_items 就不會再增加了 , 但是 client 還是可以 set key / get key 沒問題
  • 如果關掉某些 memcache server , 所有的 set 動作 “會” 再重新分配到其他活的 server 上, 要注意 memcache server 群的容量問題, 在 expire 時間內還是可以抓到資料, 不過還是有隨機的 set 是 fail 的(不多啦!)
  • 如果 add的一堆 server 都掛了 , 那麼會 hang 在 set/get 上面 , 等 tcp timeout

Read more

notebook

看到這張 OpenSQLCamp 的照片,

http://www.flickr.com/photos/datacharmer/3075006158/sizes/o/

我又想買一台 notebook , 看起來外國 programmer 喜歡用 Mac 的真的很多

不過我想一想, 我的生活圈頂多在 家 <—> 公司間 , 兩邊都有 PC , 況且我也討厭身上揹著重重的東西來來去去的, 所以算了吧… 看看就好

順便看了這個人的 Flickr : Helsinki  – restroom with a view

http://www.flickr.com/photos/datacharmer/2797070429/sizes/o/

這個廁所的 View 可真好!

Categories JOB

USE Oracle / oci8 with PHP / test sample code

前提環境要先裝好 Oracle instant client , 然後 PHP 要把 instantclient 編譯進去

–with-oci8=instantclient,/usr/lib/oracle/10.2.0.3/client/lib

這是 sample code

$conn = OCILogon('scott', 'scott', '//172.30.0.176/DB1');

$query = 'select * from dept';

$stid = OCIParse($conn, $query);
OCIExecute($stid, OCI_DEFAULT);
while ($succ = OCIFetchInto($stid, $row)) {
  foreach ($row as $item) {
    echo $item." ";
  }
  echo "\n";
}

OCILogoff($conn);


1. 建 oracle table 時不管key 的 table name , field name 是否為小寫, 在 oracle 都顯示成大寫
2. 用 PHP 的 OCI functions 下的 SQL command 也可以不管大小寫