分类目录归档:Linux&Unix

php调用shell程序出现僵尸程序defunct

php调用bash shell
[php]
system("/home/app/clean_queue.sh", $retval);
[/php]

clean_queue.sh如下:
[bash]
#!/bin/bash
sid="/data/httpsqs/queue"
pid=`ps -ef|grep -v grep|grep $sid|sed -n ’1P’|awk ‘{print $2}’`
while [ -n "$pid" ]
do
echo "queue id=$pid"
kill $pid
pid=`ps -ef|grep -v grep|grep $sid|sed -n ’1P’|awk ‘{print $2}’`
done

echo "has shutdown queue."
rm -rf /data/httpsqs/queue/httpsqs.db
echo "has delete queue db."

/usr/bin/httpsqs -d -p 1234 -x /data/httpsqs/queue
echo "has restarted page queue"

pid2=`ps -ef|grep -v grep|grep $sid|sed -n ’1P’|awk ‘{print $2}’`
while [ -z "$pid2" ]
do
echo "queue has not been started, ready to retry."
/usr/bin/httpsqs -d -p 1234 -x /data/httpsqs/queue
pid2=`ps -ef|grep -v grep|grep $sid|sed -n ’1P’|awk ‘{print $2}’`
done
echo "end check if started"
[/bash]

但执行的时候此段php代码始终不结束
[bash]
[root@script ~]# ps -ef|grep defunct
root 11273 21369 0 16:58 pts/0 00:00:00 php test_defunct.php
root 11275 11273 0 16:58 pts/0 00:00:00 [sh] <defunct>
root 11384 13877 0 16:59 pts/2 00:00:00 grep defunct
[/bash]

刚开始看到/usr/bin/httpsqs的背景颜色是红色的,以为是权限的问题,后来chmod u-s /usr/bin/httpsqs去掉suid属性还是问题依旧。
后来感觉是不是httpsqs启动后是deamon程序,调用的php一直判断这个shell没结果,就一直等,尝试加上nohup后台执行,如下面的写法:
[bash]
system("nohup /home/app/clean_queue.sh > /home/app/log/clean_queue 2>&1", $retval);
[/bash]
果然就不出僵尸进程了。

mysql复制将slave转化为master

更改my.cnf配置后出现下面的错误提示:
[bash]
[root@zt_script ~]# service mysqld restart
Shutting down MySQL. [ OK ]
Starting MySQL..The server quit without updating PID file ([FAILED]sql/zt_script.pid).
[/bash]

查看错误日志
[bash]
121224 11:01:44 [Warning] Neither –relay-log nor –relay-log-index were used; so replication may break when this MySQL server acts as a slav
e and has his hostname changed!! Please use ‘–relay-log=zt_script-relay-bin’ to avoid this problem.
121224 11:01:44 [ERROR] Failed to open the relay log ‘./mysql-relay-bin.000004′ (relay_log_pos 504)
121224 11:01:44 [ERROR] Could not find target log during relay log initialization
121224 11:01:44 [ERROR] Failed to initialize the master info structure
[/bash]
解决方法:
1.停止slave:
[bash]
slave stop;
reset slave;
[/bash]
2.停止mysqld
[bash]
service mysqld stop
[/bash]
3.然后备份现有的mysql-bin.index和mysql-relay-bin.*日志文件;
4.再删除上面备份前的日志文件;
5.重启即可。

Hyper-V装CentOS需要的Linux Integration Components的步骤分享[精]

步骤如下:

首先需要kernel-devel和gcc
我的是64位的CentOS,还需要adjtimex RPM确保时间准确性
因为没网,安装就得从光盘安装。要将yum的repo设置为光盘
于是
# cd /etc/yum.repo.d
1两个repo
CentOS内有两个repo
CentOS-Base.repo及CentOS-Media.repo
Base.repo是在线更新repo
Media.repo是输入设备repo
先将的CentOS-Base.repo更名,让系统跳过该repo
# mv CentOS-Base.repo  CentOS-Base.repo.bk
设定repo来源,baseurl设为光驱目录 /mnt/cdrom,enabled为1代表启动
# vim CentOS-Media.repo
2vim CentOS-Media.repo
改成
3改成把CentOS的碟载入本虚拟机光驱然后挂载到目录# mkdir /mnt/cdrom# mount /dev/cdrom /mnt/cdrom4挂载到目录安装kernel-devel套件# yum install kernel kernel-devel -y完成后安装gcc套件# yum install gcc -y64位系统还需要安装adjtimex RPM# rpm –ivh /mnt/cdrom/Centos/adjtimex-1.20-2.1.x86_64.rpm然后umount 原始安裝光碟# umount /mnt/cdrom在Hyper-V控制器里面把微软官网Linux Integration Services v2.1 for Windows Server 2008 Hyper-V R2地址:http://www.microsoft.com/downloads/details.aspx?displaylang=zh-tw&FamilyID=eee39325-898b-4522-9b4c-f4b5b9b64551解压得到的ISO加载到光驱然后# mount -t  iso9660  /dev/cdrom  /mnt/cdrom# cp /mnt/cdrom/* /opt/linux -R然后去安装就行了
# cd /opt/linux_ic_v21_rtm# make# make install
最后重启# reboot
配置好了可以ifconfig看看
5ifconfig看看
名称分别为ifcfg-eth0,ifcfg-eth1….如果你有一块CentOS网卡IP,就只有ifcfg-eth0一个文件,如果你有两块或者两块以上的CentOS网卡IP,就会有ifcfg-eth1、ifcfg-eth2等文件的出现。文件结构:
  1. DEVICE=eth0 //指出设备名称BOOTPROTO=static//启动类型 dhcp,,,,dcph或static 自动和手动BROADCAST=192.168.1.255 //广播地址HWADDR=00:06:5B:FE:DF:7C//硬件Mac地址IPADDR=192.168.0.2//IP地址NETMASK=255.255.255.0   //子网掩码NETWORK=192.168.0.1     //网络地址ONBOOT=yes  //是否启动应用TYPE=Ethernet     //网络类型

1  vim /etc/sysconfig/network-scripts/ifcfg-teh02 .启动服务service network restartCentOS网卡编辑主机用的DNS服务器信息命令:vim /etc/resolv.conf

Bash Shell 判断进程存在的3种方法

bash版本:
GNU bash, version 3.2.48(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
假设当前系统中的进程有如下几个:
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 3480 1 0 07:57 ? 00:00:00 /usr/sbin/bluetoothd
root 2425 1 0 07:56 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe
syslog 2272 1 0 07:56 ? 00:00:00 /sbin/syslogd -u syslog
root 2147 1 0 07:56 tty4 00:00:00 /sbin/getty 38400 tty4
root 2148 1 0 07:56 tty5 00:00:00 /sbin/getty 38400 tty5
root 2154 1 0 07:56 tty2 00:00:00 /sbin/getty 38400 tty2
root 2156 1 0 07:56 tty3 00:00:00 /sbin/getty 38400 tty3
root 2157 1 0 07:56 tty6 00:00:00 /sbin/getty 38400 tty6
root 3255 1 0 07:57 ? 00:00:00 /usr/sbin/vsftpd
……
这里我们检测vsftpd进程的存在与否
方法一:使用ps -p命令
ps -p命令根据给定的pid参数判断是否有这个进程,如果有这个进程正常退出,退出值0。如果没有这个进程异常退出,退出值1。
例如:
$ ps -p 3255
PID TTY TIME CMD
3255 ? 00:00:00 vsftpd
$ echo $?
0
$ ps -p 3000
PID TTY TIME CMD
$ echo $?
1
方法二:使用pgrep命令
pgrep命令根据给出的进程名判断是否有这个名字的进程。如果有这个名字的进程正常退出,退出值0。如果没有这个名字的进程异常退出,退出值1。
例如:
$ pgrep vsftpd
3255
$ echo $?
0
$ pgrep qq
$ echo $?
1
此方法不够准确,比如你执行 $ pgrep vsf 一样可以查询到3255。
方法三:查看/proc目录
每个进程都会在/proc下有一个以进程PID命名的目录。
例如:
$ ls /proc/3255/
ls: 无法读取符号链接 /proc/3255/cwd: Permission denied
ls: 无法读取符号链接 /proc/3255/root: Permission denied
ls: 无法读取符号链接 /proc/3255/exe: Permission denied
attr cpuset io mountinfo pagemap smaps wchan
auxv cwd latency mounts personality stat
cgroup environ limits mountstats root statm
clear_refs exe loginuid net sched status
cmdline fd maps oom_adj schedstat syscall
coredump_filter fdinfo mem oom_score sessionid task
$ ls /proc/3000
ls: 无法访问 /proc/3000: 没有该文件或目录
可以根据上面的事例,编写shell脚本判断一个进程存在与否。下面以方法二和三编写脚本,方法一类似。
脚本一:
#!/bin/bash
if [ -z $1 ]
then
echo “需要参数”
exit 1
fi

if test $( pgrep -f $1 | wc -l ) -eq 0
then
echo “进程不存在”
else
echo “存在进程”
fi
脚本二:
#!/bin/bash
if [ -z $1 ]
then
echo “需要进程PID”
exit 1
fi

if [ -d /proc/$1 ];then
echo “存在此进程”
else
echo “进程不错在”
fi

TokeyTyrant (TT Server) ULog 管理,数据清空以及结构优化[转]

TT Server 做为比较方便的KV系统,他提供了Memcache协议进行数据操作,但是没有提供API来作为对其的一个管理机制,他只提供了Shell的方式管理,并且文档相对来说比较少,所以我自己写了一个TTServer的 Ulog 清理和数据库自动清空的脚本来做自动管理,希望有类似需求的同学可以从这个我这个脚本中裁剪出自己需要的脚本,自动运行可以采取Crontab来完成。

[shell]
#!/bin/bash
#请正确设置下面的三个关键变量,目录的话不要用/结尾
TT_INSTALL_HOME="/usr/local/bin" #TTServer 安装文件目录
DIR_ULOG="/home/remon/DevelopKit/server/TT/tokyotyrant/tokyotyrant-1.1.41/ulog" #ulog所在目录
TT_SERVICE_PORT="8080"
#以上三个变量请务必设置正确
if [ -z $1 -a -d $DIR_ULOG ]
then
echo "Please input ulog dir"
exit
fi
cd $DIR_ULOG
ULOG_FILE_COUNT=`find $DIR_ULOG -name ‘*.ulog’ | wc -l` #获取ULOG文件数量
JUMP_FILE_COUNT=0 #ULOG文件不删除文件计数
STR_CURTIME=`date +"%Y-%m-%d %H:%M:%S"` #当前的系统时间
DATA_CURTIME=`date -d "$STR_CURTIME" +%s` #转换成秒
PROCESS_RES_FILE="$DIR_ULOG/res.txt" #处理日志输出文件
echo "ulog dir : " $DIR_ULOG
echo System time is $STR_CURTIME
echo "Ulog file count : " $ULOG_FILE_COUNT
echo "******** Start empty tt’s data! ********" >> $PROCESS_RES_FILE
$TT_INSTALL_HOME/tcrmgr vanish -port $TT_SERVICE_PORT localhost
$TT_INSTALL_HOME/tcrmgr optimize -port $TT_SERVICE_PORT localhost
echo "******** TT is cleared up! ********" >> $PROCESS_RES_FILE
echo "******** Start clear ulog file! ********" >> $PROCESS_RES_FILE
DELAY_TIME=$($TT_INSTALL_HOME/tcrmgr inform -port $TT_SERVICE_PORT -st localhost | awk ‘$1=="delay"”{print $2}’)
if [ -z $DELAY_TIME ]
then
DELAY_TIME=60 #如果无法查询得到复制延迟,那么设定延迟时间为60秒
fi
DELAY_TIME=$(printf %.0f $DELAY_TIME) #将时差四舍五入为整数
for ULOG_FILE in `ls -t $DIR_ULOG | awk ‘{print $1}’`
do
FILE_SUFFIX=${ULOG_FILE##*.} #获取文件后缀名
STR_LASTTIME=$(ls -lt $ULOG_FILE | awk ‘{print $6,$7}’) #获取文件的最后时间
DATA_LASTTIME=`date -d "$STR_LASTTIME" +%s` #转换成秒
INTERVAL_TIME=`expr $DATA_CURTIME – $DATA_LASTTIME` #计算2个时间的差
if [ $INTERVAL_TIME -gt $DELAY_TIME -a $FILE_SUFFIX = "ulog" ]
then
if [ $JUMP_FILE_COUNT -lt 2 ] #最后保留两个最新的ULOG文件,即使这个ULOG最后修改时间和当前时间的差大于同步时差。
then
((JUMP_FILE_COUNT=$JUMP_FILE_COUNT + 1))
continue
fi
echo file will be deleted: $ULOG_FILE $INTERVAL_TIME S >> $DIR_ULOG/res.txt
#rm -rf $ULOG_FILE
fi
done
echo "******** ULog file cleared up! ********" >> $PROCESS_RES_FILE
echo -e "Task over!" `date` "/n/n" >> $PROCESS_RES_FILE
[/shell]

转自:http://blog.csdn.net/DAGiGi/article/details/6265083

Redis常用命令

Redis提供了丰富的命令(command)对数据库和各种数据类型进行操作,这些command可以在Linux终端使用。在编程时,比如使用Redis 的Java语言包,这些命令都有对应的方法,比如上面例子中使用的sadd方法,就是对集合操作中的SADD命令。下面将Redis提供的命令做一总结。

连接操作相关的命令

Ÿ   quit:关闭连接(connection)

Ÿ   auth:简单密码认证

对value操作的命令

Ÿ   exists(key):确认一个key是否存在

Ÿ   del(key):删除一个key

Ÿ   type(key):返回值的类型

Ÿ   keys(pattern):返回满足给定pattern的所有key

Ÿ   randomkey:随机返回key空间的一个key

Ÿ   rename(oldnamenewname):将key由oldname重命名为newname,若newname存在则删除newname表示的key

Ÿ   dbsize:返回当前数据库中key的数目

Ÿ   expire:设定一个key的活动时间(s)

Ÿ   ttl:获得一个key的活动时间

Ÿ   select(index):按索引查询

Ÿ   move(keydbindex):将当前数据库中的key转移到有dbindex索引的数据库

Ÿ   flushdb:删除当前选择数据库中的所有key

Ÿ   flushall:删除所有数据库中的所有key

对String操作的命令

Ÿ   set(key, value):给数据库中名称为key的string赋予值value

Ÿ   get(key):返回数据库中名称为key的string的value

Ÿ   getset(key, value):给名称为key的string赋予上一次的value

Ÿ   mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的value

Ÿ   setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value

Ÿ   setex(keytimevalue):向库中添加string(名称为key,值为value)同时,设定过期时间time

Ÿ   mset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i

Ÿ   msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称key i赋值为value i

Ÿ   incr(key):名称为key的string增1操作

Ÿ   incrby(key, integer):名称为key的string增加integer

Ÿ   decr(key):名称为key的string减1操作

Ÿ   decrby(key, integer):名称为key的string减少integer

Ÿ   append(key, value):名称为key的string的值附加value

Ÿ   substr(key, start, end):返回名称为key的string的value的子串

对List操作的命令

Ÿ   rpush(key, value):在名称为key的list尾添加一个值为value的元素

Ÿ   lpush(key, value):在名称为key的list头添加一个值为value的 元素

Ÿ   llen(key):返回名称为key的list的长度

Ÿ   lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)

Ÿ   ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素

Ÿ   lindex(key, index):返回名称为key的list中index位置的元素

Ÿ   lset(key, index, value):给名称为key的list中index位置的元素赋值为value

Ÿ   lrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0从头至尾删除count个值为value的元素,count<0从尾到头删除|count|个值为value的元素。

Ÿ   lpop(key):返回并删除名称为key的list中的首元素

Ÿ   rpop(key):返回并删除名称为key的list中的尾元素

Ÿ   blpop(key1, key2,… key N, timeout):lpop命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对key i+1开始的list执行pop操作。

Ÿ   brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。

Ÿ   rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

对Set操作的命令

Ÿ   sadd(key, member):向名称为key的set中添加元素member

Ÿ   srem(key, member:删除名称为key的set中的元素member

Ÿ   spop(key:随机返回并删除名称为key的set中一个元素

Ÿ   smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合

Ÿ   scard(key:返回名称为key的set的基数

Ÿ   sismember(key, member) :测试member是否是名称为key的set的元素

Ÿ   sinter(key1, key2,…key N:求交集

Ÿ   sinterstore(dstkey, key1, key2,…key N:求交集并将交集保存到dstkey的集合

Ÿ   sunion(key1, key2,…key N:求并集

Ÿ   sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合

Ÿ   sdiff(key1, key2,…key N:求差集

Ÿ   sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合

Ÿ   smembers(key) :返回名称为key的set的所有元素

Ÿ   srandmember(key) :随机返回名称为key的set的一个元素

对zset(sorted set)操作的命令

Ÿ   zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。

Ÿ   zrem(key, member) :删除名称为key的zset中的元素member

Ÿ   zincrby(key, increment, member:如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment

Ÿ   zrank(key, member:返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”

Ÿ   zrevrank(key, member:返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”

Ÿ   zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素

Ÿ   zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素

Ÿ   zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的所有元素

Ÿ   zcard(key):返回名称为key的zset的基数

Ÿ   zscore(key, element):返回名称为key的zset中元素element的score

Ÿ   zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素

Ÿ   zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素

Ÿ   zunionstore / zinterstore(dstkeyNkey1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。

对Hash操作的命令

Ÿ   hset(key, field, value):向名称为key的hash中添加元素field<—>value

Ÿ   hget(key, field):返回名称为key的hash中field对应的value

Ÿ   hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value

Ÿ   hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i

Ÿ   hincrby(key, field, integer):将名称为key的hash中field的value增加integer

Ÿ   hexists(key, field):名称为key的hash中是否存在键为field的域

Ÿ   hdel(key, field):删除名称为key的hash中键为field的域

Ÿ   hlen(key):返回名称为key的hash中元素个数

Ÿ   hkeys(key):返回名称为key的hash中所有键

Ÿ   hvals(key):返回名称为key的hash中所有键对应的value

Ÿ   hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

持久化

Ÿ   save:将数据同步保存到磁盘

Ÿ   bgsave:将数据异步保存到磁盘

Ÿ   lastsave:返回上次成功将数据保存到磁盘的Unix时戳

Ÿ   shundown:将数据同步保存到磁盘,然后关闭服务

远程服务控制

Ÿ   info:提供服务器的信息和统计

Ÿ   monitor:实时转储收到的请求

Ÿ   slaveof:改变复制策略设置

Ÿ   config:在运行时配置Redis服务器

tokyo tyrant 安装日志

tokyo tyrant是一个可持久化的缓存服务器,类似memcachedb,tokyo tyrant本身是个缓存服务器,但需要tokyo cabinet作为存储引擎,
就像memcachedb中的memcache需要berkeley db一样

1)安装存储引擎tokyo cabinet
[bash]
wget http://1978th.net/tokyocabinet/tokyocabinet-1.4.47.tar.gz
tar xzvf tokyocabinet-1.4.47.tar.gz
cd tokyocabinet-1.4.47
./configure –prefix=/path/to/tokyocabinet-1.4.47
make
sudo make install
[/bash]

2)如果需要使用像队列等扩展,则要安装lua
[bash]
wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
tar zxf lua-5.1.4.tar.gz
cd lua-5.1.4
make linux
make install
[/bash]
如果出现类似如下错误:
In file included from lua.h:16,
from lua.c:15:
luaconf.h:275:31: error: readline/readline.h: No such file or directory
luaconf.h:276:30: error: readline/history.h: No such file or directory
lua.c: In function ‘pushline’:
lua.c:182: warning: implicit declaration of function ‘readline’
lua.c:182: warning: assignment makes pointer from integer without a cast
lua.c: In function ‘loadline’:
lua.c:210: warning: implicit declaration of function ‘add_history’
make[2]: *** [lua.o] Error 1
make[2]: Leaving directory `/root/tool/lua-5.1.4/src’
make[1]: *** [linux] Error 2
make[1]: Leaving directory `/root/tool/lua-5.1.4/src’
make: *** [linux] Error 2

则表示readline-devel没装, 执行yum -y install readline-devel安装,或者从源码安装:
[bash]
wget ftp://ftp.cwru.edu/pub/bash/readline-6.1.tar.gz
tar -zxvf readline-6.1.tar.gz
cd ~~ ./configure && make && make install
ldconfig
[/bash]

3)安装toyko tyrant
[bash]
wget http://1978th.net/tokyotyrant/tokyotyrant-1.1.41.tar.gz
tar xzvf tokyotyrant-1.1.41.tar.gz
cd tokyotyrant-1.1.41
./configure –prefix=/usr/local/tokyotyrant-1.1.41 –with-tc=/usr/local/tokyocabinet-1.4.47 –enable-lua
[/bash]

4) 测试
4.1)演示非持久性
4.1.1)启动服务:
bin/ttserver

4.1.2)使用客户端
另起一个终端
存放: bin/tcrmgr put localhost one first
获取: bin/tcrmgr get localhost one
得到结果 first

4.2.3)测试持久
重启ttserver,再次获取bin/tcrmgr get localhost one
没有结果

4.2)演示持久性
3.2.1)启动服务
bin/ttserver /tmp/x.tch

4.2.2)使用客户端
另起一个终端
存放: bin/tcrmgr put localhost one first
获取: bin/tcrmgr get localhost one

4.2.3)测试持久
重启ttserver
再次获取:
bin/tcrmgr get localhost one

Tokyo Tyrant(ttserver) java api的安装【转】

Tokyo Tyrant(ttserver)的安装请看我的上一篇文章http://gqf2008.iteye.com/admin/blogs/366963

 

 

编译java api

http://tokyocabinet.sourceforge.net/javapkg/tokyocabinet-java-1.18.tar.gz

tar zxvf tokyocabinet-java-1.18.tar.gz

cd tokyocabinet-java-1.18

编译时一定要设置JAVA_HOME环境变量,不然会报找不到jni.h错误

export JAVA_HOME=…..

./configure

make

make install

编辑当前用户的环境变量,增加一下这些参数

CLASSPATH=$CLASSPATH:/usr/local/lib/tokyocabinet.jar

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

export CLASSPATH LD_LIBRARY_PATH

重新登陆让环境变量生效,或者执行source ~/.bashrc (ubuntu下是这个文件)

 

跑一下例子

cd example

javac *.java

java TCBDBEX

hop

bar:step

baz:jump

foo:hop

 

java TCFDBEX

one

1:one

12:twelve

144:one forty four

 

java TCHDBEX

hop

foo:hop

bar:step

baz:jump

转自:http://gqf2008.iteye.com/blog/372753

tokyotyrant-java客户端[转]

目录:

概述
演示
[一]、概述

java实现了对ttserver服务端的连接和访问。相关的源代码和jar包可以到其官网下载。

官网地址:http://code.google.com/p/tokyotyrant-java/

如果是maven构建项目的,在pom.xml 的节点中增加如下依赖配置即可:
[xml]
<dependency>
<groupId>tokyotyrant</groupId>
<artifactId>tokyotyrant</artifactId>
<version>0.11</version>
</dependency>
<dependency>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
<version>3.1.5.GA</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
[/xml]
[二]、演示

1.RDB :官方Tokyo Tyrant API的实现

演示代码:RDBExample.java

[java]
package com.micmiu.nosql.ttserver;

import java.io.IOException;
import java.net.InetSocketAddress;

import tokyotyrant.RDB;
import tokyotyrant.transcoder.DoubleTranscoder;
import tokyotyrant.transcoder.IntegerTranscoder;

/**
*
* blog http://www.micmiu.com
*
* @author Michael
*
*/
public class RDBExample {

public static void main(String[] args) throws IOException {

RDB db = new RDB();
try {
// connect to the server
// db.open(new NodeAddress("tcp://192.168.126.134:1978"));
db.open(new InetSocketAddress("192.168.126.134", 1978));

Object key;
Object value;
// store records
if (db.put("my_firstname", "Sun")) {
System.out.println("db put my_firstname successful.");
} else {
System.out.println("db put my_firstname error.");
}

if (db.put("my_lastname", "Michael")) {
System.out.println("db put my_lastname successful.");
} else {
System.out.println("db put my_lastname error.");
}

if (db.put("my_blogurl", "www.micmiu.com")) {
System.out.println("db put my_blogurl successful.");
} else {
System.out.println("db put my_blogurl error.");
}

if (db.put("my_weibo", "www.sina.com/ctosun")) {
System.out.println("db put my_weibo successful.");
} else {
System.out.println("db put my_weibo error.");
}

// retrieve records
value = db.get("my_blogurl");
System.out.println("test_blogurl =: " + value);

value = db.get("test_noexit");
System.out.println("test_noexit =: " + value);

System.out.println("===== test repeat put ");
db.put("test_desc", "hello world");
System.out.println("test_desc =: " + db.get("test_desc"));
db.put("test_desc", "repeat put value is hello Michael");
System.out.println("test_desc =: " + db.get("test_desc"));

// Initialize the iterator
System.out.println("===== access all key ");
db.iterinit();
while ((key = db.iternext()) != null) {
value = db.get(key);
System.out.println(key + " =: " + value);
}
System.out.println("===== test int double ");
// add int
db.put("int_i", 3, new IntegerTranscoder());
int i = db.addint("int_i", 4);
System.out.println(" i =: " + i);
System.out.println("int_i =: "
+ db.get("int_i", new IntegerTranscoder()));

// add double
db.put("dou_d", 3.0D, new DoubleTranscoder());
double d = db.adddouble("dou_d", 4.0D);
System.out.println(" d =: " + d);
System.out.println("dou_d =: "
+ db.get("dou_d", new DoubleTranscoder()));

} catch (Exception e) {
e.printStackTrace();
} finally {
// close the connection
db.close();
}
}
}
[/java]
运行日志如下:

db put my_firstname successful.
db put my_lastname successful.
db put my_blogurl successful.
db put my_weibo successful.
test_blogurl =: www.micmiu.com
test_noexit =: null
===== test repeat put
test_desc =: hello world
test_desc =: repeat put value is hello Michael
===== access all key
my_firstname =: Sun
my_lastname =: Michael
my_blogurl =: www.micmiu.com
my_weibo =: www.sina.com/ctosun
test_desc =: repeat put value is hello Michael
===== test int double
i =: 7
int_i =: 7
d =: 7.0
dou_d =: 7.0

2.MRDB :用于多数据源,可复制、可靠性高、响应快等特点

演示代码:MRDBExample.java

[java]
package com.micmiu.nosql.ttserver;

import tokyotyrant.MRDB;
import tokyotyrant.networking.NodeAddress;

/**
*
* blog http://www.micmiu.com
*
* @author Michael
*
*/
public class MRDBExample {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {

MRDB db = null;
try {
db = new MRDB();
// connect to the server
db.open(NodeAddress.addresses("tcp://192.168.126.134:1978"));
Object value;
// store records
if (db.await(db.put("my_firstname", "Sun"))) {
System.out.println("MRDB put my_firstname successful.");
} else {
System.out.println("MRDB put my_firstname error.");
}

if (db.await(db.put("my_lastname", "Michael"))) {
System.out.println("MRDB put my_lastname successful.");
} else {
System.out.println("MRDB put my_lastname error.");
}

if (db.await(db.put("my_blogurl", "www.micmiu.com"))) {
System.out.println("MRDB put my_blogurl successful.");
} else {
System.out.println("MRDB put my_blogurl error.");
}

if (db.await(db.put("my_weibo", "www.sina.com/ctosun"))) {
System.out.println("MRDB put my_weibo successful.");
} else {
System.out.println("MRDB put my_weibo error.");
}

// retrieve records
value = db.await(db.get("my_blogurl"));
System.out.println("test_blogurl =: " + value);

value = db.await(db.get("test_noexit"));
System.out.println("test_noexit =: " + value);

System.out.println("===== test repeat put ");
db.put("test_desc", "hello world");
System.out.println("test_desc =: " + db.await(db.get("test_desc")));
db.put("test_desc", "repeat put value is hello Michael");
System.out.println("test_desc =: " + db.await(db.get("test_desc")));

// add int
db.put("int_i", 4);
// add double
db.put("dou_d", 8.8D);

// Initialize the iterator
System.out.println("===== access all key ");
Object[] keys = db
.await(db.fwmkeys("", db.size().get().intValue()));
for (Object keyObj : keys) {
System.out.println(keyObj + " =: " + db.await(db.get(keyObj)));
}

} catch (Exception e) {
e.printStackTrace();
} finally {
// close the connection
db.close();
}
}
}
[/java]
运行结果:

[16:42:42] INFO [tokyotyrant.networking.nio.NioNode] – Connect tcp://192.168.126.134:1978
MRDB put my_firstname successful.
MRDB put my_lastname successful.
MRDB put my_blogurl successful.
MRDB put my_weibo successful.
test_blogurl =: www.micmiu.com
test_noexit =: null
===== test repeat put
test_desc =: hello world
test_desc =: repeat put value is hello Michael
===== access all key
my_firstname =: Sun
my_lastname =: Michael
my_blogurl =: www.micmiu.com
my_weibo =: www.sina.com/ctosun
int_i =: 4
test_desc =: repeat put value is hello Michael
dou_d =: 8.8
[16:42:42] INFO [tokyotyrant.networking.nio.NioNode] – Disconnect tcp://192.168.126.134:1978
[16:42:42] INFO [tokyotyrant.networking.nio.NioNetworking] – Stopped. So will not handle IO. 0 keys will be ignored
————————

转自:http://www.micmiu.com/nosql/tokyotyrant-java-client/