sqoop-hive-hbase-memcached命令

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

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值