Nodejs 数据库 ·

redis命令之操作hash散列

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一个接一个的取出键的值,从而避免因为一次获取多个大体积的值而导致服务器阻塞。

参与评论