在Redis哈希中获取字段类型

时间:2017-09-07 06:05:31

标签: redis redis-cache

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

> set server terver
OK
> get server
"terver"

> type server
"string"

但是当我创建哈希 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内的字段类型?

1 个答案:

答案 0 :(得分:0)

  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"
    
  3. 因此,在您的Lua脚本中,您必须在将类型分类为Number之前检查字符串模式是否为数字。