sqoop-hive-hbase-memcached
sqoop是1.4.3版本的Document,如果有错误,希望大家指正。
1.使用sqoop导入数据
sqoop import --connectjdbc:mysql://localhost/db --username foo --table TEST
2.账号密码
sqoop import --connectjdbc:mysql://database.example.com/employees \
--username aaron --password 12345
3.驱动
sqoop import --drivercom.microsoft.jdbc.sqlserver.SQLServerDriver \
--connect string> ...
4.写sql语句导入的方式
sqoop import \
--query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE$CONDITIONS' \
--split-by a.id --target-dir /user/foo/joinresults
如果是顺序导入的话,可以只开一个线程
sqoop import \
--query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE$CONDITIONS' \
-m 1 --target-dir /user/foo/joinresults
如果where语句中有要用单引号的,就像这样子写就可以啦"SELECT * FROM x WHERE a='foo' AND \$CONDITIONS"
5. 1.4.3版本的sqoop不支持复杂的sql语句,不支持or语句
6.--split-by
默认是主键,假设有100行数据,它会执行那个SELECT * FROM sometable WHERE id >= lo AND id
7.--direct 是为了利用某些数据库本身提供的快速导入导出数据的工具,比如mysql的mysqldump
性能比jdbc更好,但是不知大对象的列,使用的时候,那些快速导入的工具的客户端必须的shell脚本的目录下
8.导入数据到hdfs目录,这个命令会把数据写到/shared/foo/目录
sqoop import--connnect --table foo --warehouse-dir/shared \
或者
sqoop import --connnect --tablefoo --target-dir /dest \
9.传递参数给快速导入的工具,使用--开头,下面这句命令传递给mysql默认的字符集是latin1
sqoop import --connectjdbc:mysql://server.foo.com/db --table bar \
--direct -- --default-character-set=latin1
10.转换为对象
--map-column-java 转换为java数据类型
--map-column-hive 转转为hive数据类型
11.增加导入
--check-column(col) Specifies the column to beexamined when determining which rows to import.
--incremental(mode) Specifies how Sqoop determineswhich rows are new. Legal values for mode include append and lastmodified.
--last-value(value) Specifies the maximum value ofthe check column from the previous import.
增加导入支持两种模式append和lastmodified,用--incremental来指定
12.在导入大对象
比如BLOB和CLOB列时需要特殊处理,小于16MB的大对象可以和别的数据一起存储,超过这个值就存储在_lobs的子目录当中
它们采用的是为大对象做过优化的存储格式,最大能存储2^63字节的数据,我们可以用--inline-lob-limit参数来指定每个lob文件最大的限制是多少 如果设置为0,则大对象使用外部存储
13.分隔符、转移字符
下面的这句话
Some string, with a comma.
Another "string with quotes"
使用这句命令导入$ sqoop import --fields-terminated-by , --escaped-by \\--enclosed-by '\"' ...
会有下面这个结果
"Some string, with acomma.","1","2","3"...
"Another \"string withquotes\"","4","5","6"...
使用这句命令导入$ sqoop import --optionally-enclosed-by '\"' (the rest asabove)...
"Some string, with a comma.",1,2,3...
"Another \"string with quotes\"",4,5,6...
14.hive导入参数
--hive-home 重写$HIVE_HOME
--hive-import 插入数据到hive当中,使用hive的默认分隔符
--hive-overwrite 重写插入
--create-hive-table 建表,如果表已经存在,该操作会报错!
--hive-table [table] 设置到hive当中的表名
--hive-drop-import-delims 导入到hive时删除 \n, \r,and \01
--hive-delims-replacement 导入到hive时用自定义的字符替换掉\n, \r, and \01
--hive-partition-key hive分区的key
--hive-partition-value hive分区的值
--map-column-hive 类型匹配,sql类型对应到hive类型
15.hive空值处理
sqoop会自动把NULL转换为null处理,但是hive中默认是把\N来表示null,因为预先处理不会生效的
我们需要使用 --null-string 和 --null-non-string来处理空值把\N转为\\N
sqoop import ...--null-string '\\N' --null-non-string '\\N'
16.导入数据到hbase
导入的时候加上--hbase-table,它就会把内容导入到hbase当中,默认是用主键作为split列
也可以用--hbase-row-key来指定,列族用--column-family来指定,它不支持--direct。
如果不想手动建表或者列族,就用--hbase-create-table参数
17.代码生成参数,没看懂
--bindir Output directoryfor compiled objects
--class-name Sets thegenerated class name. This overrides --package-name. When combined with--jar-file, sets the input class.
--jar-file Disable codegeneration; use specified jar
--outdir Output directoryfor generated code
--package-name Putauto-generated classes in this package
--map-column-java Overridedefault mapping from SQL type to Java type for configured columns.
18.通过配置文件conf/sqoop-site.xml来配置常用参数
<property>
<name>property.name</name>
<value>property.value</value>
</property>
如果不在这里面配置的话,就需要像这样写命令
sqoop import -D property.name=property.value ...
19.两个特别的参数
sqoop.bigdecimal.format.string 大decimal是否保存为string,如果保存为string就是 0.0000007,否则则为1E7
sqoop.hbase.add.row.key 是否把作为rowkey的列也加到行数据当中,默认是false的
20.例子
#指定列
$sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--columns "employee_id,first_name,last_name,job_title"
#使用8个线程
$sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
-m 8
#快速模式
$sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--direct
#使用sequencefile作为存储方式
$sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--class-name com.foocorp.Employee --as-sequencefile
#分隔符
$sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--fields-terminated-by '\t' --lines-terminated-by '\n' \
--optionally-enclosed-by '\"'
#导入到hive
$sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--hive-import
#条件过滤
$sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--where "start_date > '2010-01-01'"
#用dept_id作为分个字段
$sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--split-by dept_id
#追加导入
$sqoop import --connect jdbc:mysql://db.foo.com/somedb --table sometable \
--where "id > 100000" --target-dir /incremental_dataset --append
21.导入所有的表sqoop-import-all-tables
每个表都要有主键,不能使用where条件过滤
sqoopimport-all-tables --connect jdbc:mysql://db.foo.com/corp
22.export
我们采用sqoop-export插入数据的时候,如果数据已经存在了,插入会失败
如果我们使用--update-key,它会认为每个数据都是更新,比如我们使用下面这条语句
sqoop-export --table foo --update-key id --export-dir /path/to/data--connect …
UPDATE fooSET msg='this is a test', bar=42 WHERE id=0;
UPDATE fooSET msg='some more data', bar=100 WHERE id=1;
...
这样即使找不到它也不会报错
23.如果存在就更新,不存在就插入
加上这个参数就可以啦--update-mode allowinsert
24.事务的处理
它会一次statement插入100条数据,然后每100个statement提交一次,所以一次就会提交10000条数据
25.例子
$ sqoop export --connectjdbc:mysql://db.example.com/foo --table bar \
--export-dir /results/bar_data
$sqoop export --connect jdbc:mysql://db.example.com/foo --table bar \
--export-dir /results/bar_data --validate
$sqoop export --connect jdbc:mysql://db.example.com/foo --call barproc \
--export-dir /results/bar_data
Hive:1. 开启行转列功能之后:
set hive.cli.print.header=true; // 打印列名
set hive.cli.print.row.to.vertical=true; //开启行转列功能, 前提必须开启打印列名功能
set hive.cli.print.row.to.vertical.num=1;// 设置每行显示的列数
2.使用过程中出错采用:
hive -hiveconfhive.root.logger=DEBUG,console //重启调试。
3. hive的三种启动方式区别:
1,hive 命令行模式,直接输入/hive/bin/hive的执行程序,或者输入hive –service cli
用于linux平台命令行查询,查询语句基本跟mysql查询语句类似
2,hive web界面的启动方式,hive –servicehwi
用于通过浏览器来访问hive,感觉没多大用途
3,hive 远程服务 (端口号10000) 启动方式,nohuphive –service hiveserver &
用java等程序实现通过jdbc等驱动的访问hive就用这种起动方式了,这个是程序员最需要的方式了
启动hiveservice :$HIVE_HOME/bin/hive --service hiveserver 10001 >/dev/null2>/dev/null &
4. hive插入的2中方式:
基本的插入语法:
INSERT OVERWRITE TABLE tablename[PARTITON(partcol1=val1,partclo2=val2)]select_statement FROM from_statement
insert overwrite table test_insert select *from test_table;
对多个表进行插入操作:
FROM fromstatte
INSERT OVERWRITE TABLE tablename1[PARTITON(partcol1=val1,partclo2=val2)]select_statement1
INSERT OVERWRITE TABLE tablename2 [PARTITON(partcol1=val1,partclo2=val2)]select_statement2
5.添加metastore启动脚本bin/hive-metastore.sh
#!/bin/sh
nohup ./hive --service metastore >>metastore.log 2>&1 &
echo $! > hive-metastore.pid
添加hive server启动脚本bin/hive-server.sh
nohup ./hive --service hiveserver >>hiveserver.log 2>&1 &
echo $! > hive-server.pid
启动metastore和hive server
./hive-metastore.sh
./hive-server.sh
#创建新表
hive> CREATE TABLE t_hive (a int, b int,c int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
创建一个新表,结构与其他一样
hive> create table new_table likerecords;
#导入数据t_hive.txt到t_hive表
hive> LOAD DATA LOCAL INPATH'/home/cos/demo/t_hive.txt' OVERWRITE INTO TABLE t_hive ;
#正则匹配表名
hive>show tables '*t*';
#增加一个字段
hive> ALTER TABLE t_hive ADD COLUMNS(new_col String);
#重命令表名
hive> ALTER TABLE t_hive RENAME TOt_hadoop;
#从HDFS加载数据
hive> LOAD DATA INPATH'/user/hive/warehouse/t_hive/t_hive.txt' OVERWRITE INTO TABLE t_hive2;
#从其他表导入数据
hive> INSERT OVERWRITE TABLE t_hive2SELECT * FROM t_hive ;
#创建表并从其他表导入数据
hive> CREATE TABLE t_hive AS SELECT *FROM t_hive2 ;
#仅复制表结构不导数据
hive> CREATE TABLE t_hive3 LIKE t_hive;
#通过Hive导出到本地文件系统
hive> INSERT OVERWRITE LOCAL DIRECTORY'/tmp/t_hive' SELECT * FROM t_hive;
#Hive查询HiveQL
from ( select b,c as c2 from t_hive) tselect t.b, t.c2 limit 2;
select b,c from t_hive limit 2;
#创建视图
hive> CREATE VIEW v_hive AS SELECT a,bFROM t_hive;
#删表
drop table if exists t_hft;
#创建分区表
DROP TABLE IF EXISTS t_hft;
CREATE TABLE t_hft(
SecurityID STRING,
tradeTime STRING,
PreClosePx DOUBLE
) PARTITIONED BY (tradeDate INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY',';
#导入分区数据
hive> load data local inpath'/home/BlueBreeze/data/t_hft_1.csv' overwrite into table t_hftpartition(tradeDate=20130627);
#查看分区表
hive> SHOW PARTITIONS t_hft;
显示表的结构信息
hive> DESCRIBE invites;
shows the list of columns
更新表的名称:
hive> ALTER TABLE source RENAME TOtarget;
添加新一列
hive> ALTER TABLE invites ADD COLUMNS(new_col2 INT COMMENT 'a comment');
删除表:
hive> DROP TABLE records;
删除表中数据,但要保持表的结构定义
hive> dfs -rmr/user/hive/warehouse/records;
从本地文件加载数据:
hive> LOAD DATA LOCAL INPATH'/home/hadoop/input/ncdc/micro-tab/sample.txt' OVERWRITE INTO TABLE records;
显示所有函数:
hive> show functions;
查看函数用法:
hive> describe function substr;
查看数组、map、结构
hive> select col1[0],col2['b'],col3.cfrom complex;
内连接:
hive> SELECT sales.*, things.* FROMsales JOIN things ON (sales.id = things.id);
查看hive为某个查询使用多少个MapReduce作业
hive> Explain SELECT sales.*, things.*FROM sales JOIN things ON (sales.id = things.id);
外连接:
hive> SELECT sales.*, things.* FROMsales LEFT OUTER JOIN things ON (sales.id = things.id);
hive> SELECT sales.*, things.* FROMsales RIGHT OUTER JOIN things ON (sales.id = things.id);
hive> SELECT sales.*, things.* FROMsales FULL OUTER JOIN things ON (sales.id = things.id);
in查询:Hive不支持,但可以使用LEFTSEMI JOIN
hive> SELECT * FROM things LEFT SEMIJOIN sales ON (sales.id = things.id);
Map连接:Hive可以把较小的表放入每个Mapper的内存来执行连接操作
hive> SELECT /*+ MAPJOIN(things) */sales.*, things.* FROM sales JOIN things ON (sales.id = things.id);
INSERT OVERWRITE TABLE ..SELECT:新表预先存在
hive> FROM records2
> INSERT OVERWRITE TABLE stations_by_year SELECT year, COUNT(DISTINCTstation) GROUP BY year
> INSERT OVERWRITE TABLE records_by_year SELECT year, COUNT(1) GROUPBY year
> INSERT OVERWRITE TABLE good_records_by_year SELECT year, COUNT(1)WHERE temperature != 9999 AND (quality = 0 OR quality = 1 OR quality = 4 ORquality = 5 OR quality = 9) GROUP BY year;
CREATE TABLE ... AS SELECT:新表表预先不存在
hive>CREATE TABLE target AS SELECTcol1,col2 FROM source;
创建视图:
hive> CREATE VIEW valid_records ASSELECT * FROM records2 WHERE temperature !=9999;
查看视图详细信息:
hive> DESCRIBE EXTENDED valid_records;
HBase: 为用户提供了一个非常方便的使用方式, 我们称之为“HBase Shell”。
HBase Shell 提供了大多数的 HBase 命令, 通过 HBase Shell 用户可以方便地创建、删除及修改表, 还可以向表中添加数据、列出表中的相关信息等。
备注:写错 HBase Shell 命令时用键盘上的“Delete”进行删除,“Backspace”不起作用。
在启动 HBase 之后,用户可以通过下面的命令进入 HBase Shell 之中,命令如下所示:
hadoop@ubuntu:~$ hbase shell
HBase Shell; enter 'help<RETURN>' for list of supportedcommands.
Type "exit<RETURN>" to leave the HBaseShell
Version 0.94.3, r1408904, Wed Nov 14 19:55:11 UTC 2012
hbase(main):001:0>
具体的 HBase Shell 命令如下表 1.1-1 所示:
下面我们将以“一个学生成绩表”的例子来详细介绍常用的HBase 命令及其使用方法。
这 里 grad 对于表来说是一个列,course 对于表来说是一个列族,这个列族由三个列组成 china、math 和english,当然我们可以根据我们的需要在 course 中建立更多的列族,如computer,physics 等相应的列添加入 course 列族。(备注:列族下面的列也是可以没有名字的。)
1). create 命令
创建一个具有两个列族“grad”和“course”的表“scores”。其中表名、行和列都要用单引号括起来,并以逗号隔开。
hbase(main):012:0> create 'scores', 'name', 'grad', 'course'
2). list 命令
查看当前 HBase 中具有哪些表。
hbase(main):012:0> list
3). describe 命令
查看表“scores”的构造。
hbase(main):012:0> describe 'scores'
4). put 命令
使用 put 命令向表中插入数据,参数分别为表名、行名、列名和值,其中列名前需要列族最为前缀,时间戳由系统自动生成。
格式: put 表名,行名,列名([列族:列名]),值
例子:
a. 加入一行数据,行名称为“xiapi”,列族“grad”的列名为”(空字符串)”,值位 1。
hbase(main):012:0> put 'scores', 'xiapi', 'grad:', '1'
hbase(main):012:0> put 'scores', 'xiapi', 'grad:', '2' --修改操作(update)
b. 给“xiapi”这一行的数据的列族“course”添加一列“<china,97>”。
hbase(main):012:0> put 'scores', 'xiapi', 'course:china', '97'
hbase(main):012:0> put 'scores', 'xiapi', 'course:math', '128'
hbase(main):012:0> put 'scores', 'xiapi', 'course:english', '85'
5). get 命令
a.查看表“scores”中的行“xiapi”的相关数据。
hbase(main):012:0> get 'scores', 'xiapi'
b.查看表“scores”中行“xiapi”列“course :math”的值。
hbase(main):012:0> get 'scores', 'xiapi', 'course :math'
或者
hbase(main):012:0> get 'scores', 'xiapi', {COLUMN=>'course:math'}
hbase(main):012:0> get 'scores', 'xiapi', {COLUMNS=>'course:math'}
备注:COLUMN 和 COLUMNS 是不同的,scan 操作中的 COLUMNS 指定的是表的列族, get操作中的 COLUMN 指定的是特定的列,COLUMNS 的值实质上为“列族:列修饰符”。COLUMN 和 COLUMNS 必须为大写。
6). scan 命令
a. 查看表“scores”中的所有数据。
hbase(main):012:0> scan 'scores'
注意:
scan 命令可以指定 startrow,stoprow 来scan 多个 row。
例如:
scan 'user_test',{COLUMNS =>'info:username',LIMIT =>10, STARTROW =>'test', STOPROW=>'test2'}
b.查看表“scores”中列族“course”的所有数据。
hbase(main):012:0> scan 'scores', {COLUMN => 'grad'}
hbase(main):012:0> scan 'scores', {COLUMN=>'course:math'}
hbase(main):012:0> scan 'scores', {COLUMNS => 'course'}
hbase(main):012:0> scan 'scores', {COLUMNS => 'course'}
7). count 命令
hbase(main):068:0> count 'scores'
8). exists 命令
hbase(main):071:0> exists 'scores'
9). incr 命令(赋值)
10). delete 命令
删除表“scores”中行为“xiaoxue”, 列族“course”中的“math”。
hbase(main):012:0> delete 'scores', 'xiapi', 'course:math'
11). truncate 命令
hbase(main):012:0> truncate 'scores'
12). disbale、drop 命令
通过“disable”和“drop”命令删除“scores”表。
hbase(main):012:0> disable 'scores' --enable 'scores'
hbase(main):012:0> drop 'scores'
13). status命令
hbase(main):072:0> status
14). version命令
hbase(main):073:0> version
另外,在 shell 中,常量不需要用引号引起来,但二进制的值需要双引号引起来,而其他值则用单引号引起来。HBase Shell 的常量可以通过在 shell 中输入“Object.constants”。
Memcache:1、启动Memcache 常用参数
-p <num> 设置TCP端口号(默认不设置为:11211)
-U <num> UDP监听端口(默认: 11211, 0 时关闭)
-l <ip_addr> 绑定地址(默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)
-d 以daemon方式运行
-u <username> 绑定使用指定用于运行进程<username>
-m <num> 允许最大内存用量,单位M (默认: 64 MB)
-P <file> 将PID写入文件<file>,这样可以使得后边进行快速进程终止, 需要与-d 一起使用
在linux下:./usr/local/bin/memcached -d -u root -l 192.168.1.197 -m 2048 -p 12121
在window下:d:\App_Serv\memcached\memcached.exe -d RunService -l 127.0.0.1 -p11211 -m 500
在windows下注册为服务后运行:
sc.exe create Memcached_srv binpath= “d:\App_Serv\memcached\memcached.exe-d RunService -p 11211 -m 500″start= auto
net start Memcached
2、连接
telnet 127.0.0.1 11211 //ctrl+} 打开回显 再enter
3、基本命令
您将使用五种基本 memcached 命令执行最简单的操作。这些命令和操作包括:
set
add
replace
get
delete
前三个命令是用于操作存储在 memcached 中的键值对的标准修改命令。它们都非常简单易用,且都使用如下所示的语法:
command <key> <flags><expiration time> <bytes>
<value>
表 1 定义了 memcached 修改命令的参数和用法。
表 1. memcached 修改命令参数
参数 用法
key key 用于查找缓存值
flags 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
expiration time 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes 在缓存中存储的字节点
value 存储的值(始终位于第二行)
现在,我们来看看这些命令的实际使用。
3.1set
set 命令用于向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。
注意以下交互,它使用了 set 命令:
setuserId 0 0 5
12345
STORED
如果使用 set 命令正确设定了键值对,服务器将使用单词 STORED 进行响应。本示例向缓存中添加了一个键值对,其键为userId,其值为12345。并将过期时间设置为 0,这将向 memcached 通知您希望将此值存储在缓存中直到删除它为止。
3.2 add
仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。如果缓存中已经存在键,则之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
下面是使用 add 命令的标准交互:
setuserId 0 0 5
12345
STORED
adduserId 0 0 5
55555
NOT_STORED
addcompanyId 0 0 3
564
STORED
3.3replace
仅当键已经存在时,replace 命令才会替换缓存中的键。如果缓存中不存在键,那么您将从 memcached 服务器接受到一条 NOT_STORED 响应。
下面是使用 replace 命令的标准交互:
replaceaccountId 0 0 5
67890
NOT_STORED
setaccountId 0 0 5
67890
STORED
replaceaccountId 0 0 5
55555
STORED
最后两个基本命令是 get 和 delete。这些命令相当容易理解,并且使用了类似的语法,如下所示:
command <key>
接下来看这些命令的应用。
3.4get
get 命令用于检索与之前添加的键值对相关的值。您将使用 get 执行大多数检索操作。
下面是使用 get 命令的典型交互:
setuserId 0 0 5
12345
STORED
getuserId
VALUE userId 0 5
12345
END
getbob
END
如您所见,get 命令相当简单。您使用一个键来调用 get,如果这个键存在于缓存中,则返回相应的值。如果不存在,则不返回任何内容。
3.5delete
最后一个基本命令是 delete。delete 命令用于删除 memcached 中的任何现有值。您将使用一个键调用delete,如果该键存在于缓存中,则删除该值。如果不存在,则返回一条NOT_FOUND 消息。
下面是使用 delete 命令的客户机服务器交互:
setuserId 0 0 5
98765
STORED
deletebob
NOT_FOUND
deleteuserId
DELETED
getuserId
END
可以在 memcached 中使用的两个高级命令是 gets 和 cas。gets 和cas 命令需要结合使用。您将使用这两个命令来确保不会将现有的名称/值对设置为新值(如果该值已经更新过)。我们来分别看看这些命令。
3.6gets
gets 命令的功能类似于基本的 get 命令。两个命令之间的差异在于,gets 返回的信息稍微多一些:64 位的整型值非常像名称/值对的“版本” 标识符。
下面是使用 gets 命令的客户机服务器交互:
setuserId 0 0 5
12345
STORED
getuserId
VALUE userId 0 5
12345
END
getsuserId
VALUE userId 0 5 4
12345
END
考虑 get 和 gets 命令之间的差异。gets 命令将返回一个额外的值— 在本例中是整型值 4,用于标识名称/值对。如果对此名称/值对执行另一个set 命令,则gets 返回的额外值将会发生更改,以表明名称/值对已经被更新。清单 6 显示了一个例子:
清单 6. set 更新版本指示符
setuserId 0 0 5
33333
STORED
getsuserId
VALUE userId 0 5 5
33333
END
您看到 gets 返回的值了吗?它已经更新为 5。您每次修改名称/值对时,该值都会发生更改。
3.7cas
cas(check 和 set)是一个非常便捷的memcached 命令,用于设置名称/值对的值(如果该名称/值对在您上次执行 gets 后没有更新过)。它使用与 set 命令相类似的语法,但包括一个额外的值:gets 返回的额外值。
注意以下使用 cas 命令的交互:
setuserId 0 0 5
55555
STORED
getsuserId
VALUE userId 0 5 6
55555
END
casuserId 0 0 5 6
33333
STORED
如您所见,我使用额外的整型值 6 来调用 gets 命令,并且操作运行非常顺序。现在,我们来看看清单 7 中的一系列命令:
清单 7. 使用旧版本指示符的 cas 命令
setuserId 0 0 5
55555
STORED
getsuserId
VALUE userId 0 5 8
55555
END
casuserId 0 0 5 6
33333
EXISTS
注意,我并未使用 gets 最近返回的整型值,并且 cas 命令返回 EXISTS 值以示失败。从本质上说,同时使用gets 和cas 命令可以防止您使用自上次读取后经过更新的名称/值对。
缓存管理命令
最后两个 memcached 命令用于监控和清理 memcached 实例。它们是 stats 和 flush_all 命令。
3.8stats
stats 命令的功能正如其名:转储所连接的memcached 实例的当前统计数据。
3.9flush_all
flush_all 是最后一个要介绍的命令。这个最简单的命令仅用于清理缓存中的所有名称/值对。如果您需要将缓存重置到干净的状态,则 flush_all 能提供很大的用处。下面是一个使用 flush_all 的例子:
setuserId 0 0 5
55555
STORED
getuserId
VALUE userId 0 5
55555
END
flush_all
OK
get userId
END