Edited at

シェルスクリプトからmemcachedを使う

シェルスクリプトの中でmemcachedを使うためのライブラリ的なものを作りました。シェルスクリプトにincludeして使うことを想定しています。エラー処理とかテストとか不十分なので、まだPoCレベルなことをご了承ください。


前提条件

telnetが無ければインストールしておいてください。あと、もちろんmemcachedを起動しておいてください。


ソースコード


memcached.sh

MC_HOST="localhost"

MC_PORT="11211"

mc_open() {
coproc mc { telnet ${MC_HOST} ${MC_PORT}; } 2>/dev/null
# telnet接続時の出力を3行分読み飛ばす
read <&"${mc[0]}" # Trying ::1...
read <&"${mc[0]}" # Connected to localhost.
read <&"${mc[0]}" # Escape character is '^]'.
}

mc_set() {
local r
echo "set ${1} 0 ${2} ${#3}" >&"${mc[1]}"
echo "${3}" >&"${mc[1]}"
read r <&"${mc[0]}"
if [ "${r}" = "STORED" ]; then
return
0
else
echo ${r} >&2
return 1
fi
}

mc_get() {
local i r v
echo "get ${1}" >&"${mc[1]}"
for i in {0..2} # 値があれば3行目、無ければ1行目が"END"
do
read r <&"${mc[0]}"
if [ "${r}" = "END" ]; then
echo -n ${v}
break
else
v=${r}
fi
done
return
0
}

mc_close() {
echo "quit" >&"${mc[1]}"
}



使い方


sample.sh

#!/bin/sh

. ./memcached.sh

# 接続開始
mc_open

# 値のsetは キー 有効期間 値 を指定
mc_set mykey1 10 myvalue1

# 値のgetは キー を指定
v1=$(mc_get mykey1)
echo "Value of mykey1 is ${v1}."

# 値をsetしてないキーでgetすると、結果は空文字
v2=$(mc_get mykey2)
if [ "${v2}" = "" ]; then
echo "Value of mykey2 is empty."
else
echo ${v2}
fi

# 接続終了
mc_close



今後

memcachedが使えると、分散処理、並列処理などへの応用が可能になります。今後、使ってみながらブラッシュアップしていきます。