当前位置:嗨网首页>书籍在线阅读

10-命令

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

3.3.2 命令

1.赋值与取值

HSET key field value
HGET key field
HMSET key field value [field value …]
HMGET key field [field …]
HGETALL key

HSET 命令用来给字段赋值,而 HGET 命令用来获得字段的值。用法如下:

redis>HSET car price 500
(integer) 1
redis>HSET car name BMW
(integer) 1
redis>HGET car name
"BMW"

HSET 命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入操作(update)还是更新操作(insert)。当执行的是插入操作时(即之前字段不存在) HSET 命令会返回1,当执行的是更新操作时(即之前字段已经存在) HSET 命令会返回0。更进一步,当键本身不存在时, HSET 命令还会自动建立它。

提示

在Redis中每个键都属于一个明确的数据类型,如通过HSET命令建立的键是散列类型,通过SET命令建立的键是字符串类型等等。使用一种数据类型的命令操作另一种数据类型的键会提示错误: "ERR Operation against a key holding the wrong kind of value" 9。

9并不是所有命令都是如此,比如SET命令可以覆盖已经存在的键而不论原来键是什么类型。

当需要同时设置多个字段的值时,可以使用 HMSET 命令。例如,下面两条语句

HSET key field1 value1
HSET key field2 value2

可以用 HMSET 命令改写成

HMSET key field1 value1 field2 value2

相应地, HMGET 命令可以同时获得多个字段的值:

redis>HMGET car price name
1) "500"
2) "BMW"

如果想获取键中所有字段和字段值却不知道键中有哪些字段时(如3.3.1节介绍的存储汽车对象的例子,每个对象拥有的属性都未必相同)应该使用 HGETALL 命令。如:

redis>HGETALL car
1) "price"
2) "500"
3) "name"
4) "BMW"

返回的结果是字段和字段值组成的列表,不是很直观,好在很多语言的Redis客户端会将 HGETALL 的返回结果封装成编程语言中的对象,处理起来就非常方便了。例如,在Node.js中:

redis.hgetall("car", function (error, car) {
  // hgetall方法的返回的值被封装成了JavaScript的对象
  console.log(car.price);
  console.log(car.name);
});

2.判断字段是否存在

HEXISTS key field

HEXISTS 命令用来判断一个字段是否存在。如果存在则返回1,否则返回0(如果键不存在也会返回0)。

redis>HEXISTS car model
(integer) 0
redis>HSET car model C200
(integer) 1
redis>HEXISTS car model
(integer) 1

3.当字段不存在时赋值

HSETNX key field value

HSETNX 10 命令与 HSET 命令类似,区别在于如果字段已经存在, HSETNX`命令将不执行任何操作。其实现可以表示为如下伪代码:

10 HSETNX 中的“NX”表示“if Note Xists”(如果不存在)。`

def hsetnx($key, $field, $value)
  $isExists =HEXISTS $key, $field
  if $isExists is 0
    HSET $key, $field, $value
    return 1
  else
    return 0

只不过 HSETNX 命令是原子操作,不用担心竞态条件。

4.增加数字

HINCRBY key field increment

上一节的命令拾遗部分介绍了字符串类型的命令 INCRBYHINCRBY 命令与之类似,可以使字段值增加指定的整数。散列类型没有 HINCR 命令,但是可以通过 HINCRBY key field 1 来实现。

HINCRBY 命令的示例如下:

redis>HINCRBY person score 60   
(integer) 60

之前 person 键不存在, HINCRBY 命令会自动建立该键并默认 score 字段在执行命令前的值为“0”。命令的返回值是增值后的字段值。

5.删除字段

HDEL key field [field …]

HDEL 命令可以删除一个或多个字段,返回值是被删除的字段个数:

redis>HDEL car price
(integer) 1
redis>HDEL car price
(integer) 0