当前位置 博文首页 > atomatom98的博客:Redis数据库中Hash哈希的介绍,常用命令和应

    atomatom98的博客:Redis数据库中Hash哈希的介绍,常用命令和应

    作者:[db:作者] 时间:2021-09-03 18:26

    一.简介

    • Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。 可以看成一个map容器
    • Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
    • 。该类型的数据仅占用很少的磁盘空间(相比于JSON)

    二.命令

    问题:有一个人叫小明,他的信息如下,现在想要把他的信息存在redis中:

    • 姓名:xiaoming
    • 年龄:21
    • 性别:男
    • 学校:bupt

    赋值语法:

    HSET KEY  FIELD  VALUE  
    --为指定的KEY,设定FILD/VALUE  
    
    HMSET  KEY  FIELD VALUE [FIELD1,VALUE1]
    --同时将多个 field-value (域-值)对设置到哈希表 key 中
    
    

    此处我们使用第二个语句,将这四个字段写入进student:1这个hash(一个map)

    127.0.0.1:6379> hmset student:1 name xiaoming age 22 sex male school bupt
    OK
    
    

    取值语法:

    HGET KEY FIELD   //获取存储在HASH中的值,根据FIELD得到VALUE
    
    HMGET key field[field1]      //获取key所有给定字段的值 
    
    HGETALL key                 //返回HASH表中所有的字段和值 
    
    HKEYS key   //获取所有哈希表中的字段
    
    HLEN key   //获取哈希表中字段的数量
    
    

    假如我现在要获取小明的学校信息:

    127.0.0.1:6379> hmget student:1 school
    1) "bupt"
    
    

    删除语法:

    HDEL KEY field1[field2]    //删除一个或多个HASH表字段
    

    其他语法:

    HSETNX key field value 
    //只有在字段 field 不存在时,设置哈希表字段的值
    
    HINCRBY key field increment 
    //为哈希表 key 中的指定字段的整数值加上增量 increment 。
    
    HINCRBYFLOAT key field increment  
    //为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
    
    HEXISTS key field  
    //查看哈希表 key 中,指定的字段是否存在
    
    

    例如现在想要把小明的年龄加十岁:

    127.0.0.1:6379> Hincrby student:1 age 10
    (integer) 32
    127.0.0.1:6379> hmget student:1 age
    1) "32"
    

    三.应用场景:

    Hash的应用场景:(存储一个用户信息对象数据)

    • 常用于存储一个对象
    • 为什么不用string存储一个对象?

    hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。

    用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:

    • 将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题
    • 这个用户信息对象有多少成员就存成多少个key-value对,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的

    Redis提供的Hash很好的解决了这个问题,Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口

    cs