我正在探索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
内的字段类型?
答案 0 :(得分:0)
无法在哈希中获取字段类型,TYPE
仅适用于父键。
您可以使用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脚本中,您必须在将类型分类为Number之前检查字符串模式是否为数字。