Redis hash 是一个string类型的field和value的映射表,可以让用户将多个键值对存储到一个reids键里面,hash特别适合用于存储对象。从功能上来说,Redis为hash散列提供了一些与字符串值相同的特性,使得散列非常适用于将一些相关的数据存储在一起。我们可以把这种数据聚集看作是关系数据库中的行,或者文档数据库中的文档。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
下表列出了 redis hash 基本的相关命令:
命令 | 描述 |
---|---|
HDEL key field1 [field2] | 用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略 |
HEXISTS key field | 查看哈希表 key 中,指定的字段是否存在。 |
HGET key field | 获取存储在哈希表中指定字段的值 |
HGETALL key | 获取在哈希表中指定 key 的所有字段和值 |
HINCRBY key field increment | 用于为哈希表中的字段值加上指定增量值。增量也可以为负数,相当于对指定字段进行减法操作。如果哈希表的 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。对一个储存字符串值的字段执行 HINCRBY 命令将造成一个错误。本操作的值被限制在 64 位(bit)有符号数字表示之内。 |
HINCRBYFLOAT key field increment | 用于为哈希表中的字段值加上指定浮点数增量值。如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。 |
HKEYS key | 用于获取哈希表中的所有域(field) |
HLEN key | 获取哈希表中字段的数量 |
HMGET key field1 [field2] | 获取所有给定字段的值 |
HMSET key field1 value1 [field2 value2 ] | 用于同时将多个 field-value (字段-值)对设置到哈希表中。此命令会覆盖哈希表中已存在的字段。如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作 |
HSET key field value | 用于为哈希表中的字段赋值 。如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段已经存在于哈希表中,旧值将被覆盖。 |
HSETNX key field value | 只有在字段 field 不存在时,设置哈希表字段的值。如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段已经存在于哈希表中,操作无效。如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令 |
HVALS key | 获取哈希表中所有值 |
HLEN命令以及用于依次读取或者设置多个键的HMGET和HMSET则是新出现的命令,想这种批量处理多个建的命令既可以给用户带来方便,又可以通过减少命令的调用次数以及客户端与Redis之间的通信往返次数来提升Redis的性能
下面来看一下在nodejs中如何使用HMGET和HMSET,在nodejs集成redis中已经介绍了在nodejs中集成redis方法,这里不再赘述,直接示例如何使用
router.get("/setHash",function(req,res){
var data = {
"one":"hello",
"two":"hzhz",
"three":"didi",
}
myRedis.client.hmset("myRedisSet",data,function(err,result){
if(!err){
res.json(result)
}else{
res.json(err)
}
})
})
router.get("/getHash",function(req,res){
var data = ["one","two","three"]
myRedis.client.hmget("myRedisSet",data,function(err,result){
if(!err){
res.json(result)
}else{
res.json(err)
}
})
})
尽管有HGETALL存在,但是HKEYS和HVALUES也是非常有用的:如果散列包含的值非常大,那么用户可以先使用HKEYS取出散列包含的所有键,然后在使用HGET一个接一个的取出键的值,从而避免因为一次获取多个大体积的值而导致服务器阻塞。