Redis从入门到精通(7):redis的hash数据类型详解

我们可以把一些有关联的键值对作为一个整体,存储为另一个键的值。这种类似于json和python字典的数据类型就叫做hash,中文叫哈希。

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

hash数据类型

其实可以理解为redis中存了一个redis的感觉,不过外面这个键叫做key,里面的key叫做field,字段或者域。

注意哈希的值只能是string,不要在哈希中又嵌套一个哈希。

hashmap内存结构

redis的hash数据结构在内存中采用hashmap,了解hashmap在内存中的结构有助于帮助我们理解为什么hash结构查询非常快,也能帮助我们理解为什么说数据量不大的时候是数组结构,数据量大的时候是链表结构。

hashmap的底层由数组和链表一起构成,内存中一块连续的区域构成数组,通过计算key的hash值然后对数组长度取模来决定这个key存在哪一块区域。因为查询次数为1,所以查询速度很快,这也就是为什么数据量小的时候就是个数组结构。

数据量多了以后肯定会出现key的hash值计算出来一致的情况,也就是hash冲突,hashmap是通过单向链表来解决这个问题。数组中存储的只是一个单链表的头节点。如果不同的key映射到了数组的同一位置处,就将其放入单链表中。

下图引用自知乎专栏,出处在此

hashmap.jpg

真是基于这一数据存储特点,hash数据结构在查询的时候是有顺序的,但是并不是按照key的输入前后顺序。而删除增加修改都不会改变数据的顺序。

常用命令

  • hset key field value

对key中的某个域进行赋值

127.0.0.1:6380[1]> hset user:1 name xiaofu
(integer) 1
127.0.0.1:6380[1]> type user:1
hash
127.0.0.1:6380[1]>

这里key为user:1,其中存储了一个哈希数据类型。哈希当中有一个键值对,哈希中的键为name,值为xiaofu

注意如果是已经存在的key,但是类型是string,赋值hash类型的话会报错。但反之却可以给一个哈希类型赋值一个string

27.0.0.1:6380[1]> set user:1 hahaha
OK
127.0.0.1:6380[1]> type user:1
string
127.0.0.1:6380[1]> hset user:1 name xiaofu
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6380[1]>
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值