0

我正在探索 Redis,我创建了一个密钥服务器,我可以获取此处存储的值的类型,如下所示:

> set server terver
OK
> get server
"terver"

> type server
"string"

但是当我创建 hash myhash时,

> hset myhash field1 lalalal
(integer) 1
> hset myhash field2 hahaha
(integer) 1
> type myhash
"hash"

我无法获取哈希内的字段类型

> type myhash field1
(error) wrong number of arguments (given 2, expected 1)
> type myhash.field1
"none"

在这里,如果我查询

>hincrby myhash field1 2
(error) ERR hash value is not an integer

这表明存在哈希类型和操作问题。 type myhash.field1显示"none"不能是类型,因为它是字符串。

那么我怎样才能得到里面的字段类型myhash呢?

4

1 回答 1

1
  1. 无法在哈希中获取字段类型,TYPE仅适用于父键。

  2. 你可以使用 Lua 脚本来做你想做的事,但要非常清楚 redis 如何处理不同的数据类型和内部转换,并基于你的 Lua 脚本中的编写逻辑。

    127.0.0.1:6379> set server terver
    OK
    127.0.0.1:6379> get server
    "terver"
    127.0.0.1:6379> type server
    string
    127.0.0.1:6379> hset myhash field1 lalala
    (integer) 1
    127.0.0.1:6379> hset myhash field2 hahaha
    (integer) 1
    127.0.0.1:6379> type myhash
    hash
    127.0.0.1:6379> type myhash.field1
    none
    127.0.0.1:6379> type NotExistingKey
    none
    127.0.0.1:6379>  eval "return redis.call('hget','myhash','field1')"  0 
    "lalala"
    127.0.0.1:6379>  eval "return type(redis.call('hget','myhash','field1'))"  0 
    "string"
    
    127.0.0.1:6379> hset myhash field3 42
    (integer) 1
    127.0.0.1:6379>  eval "return redis.call('hget','myhash','field3')"  0 
    "42"
    127.0.0.1:6379>  eval "return type(redis.call('hget','myhash','field3'))"  0 
    "string"
    127.0.0.1:6379> hget myhash field3
    "42"
    

因此,在您的 Lua 脚本中,您必须先检查字符串模式是否为数字,然后才能将其类型分类为数字。

于 2017-09-07T08:09:23.327 回答