我们可以把一些有关联的键值对作为一个整体,存储为另一个键的值。这种类似于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映射到了数组的同一位置处,就将其放入单链表中。
下图引用自知乎专栏,出处在此。
真是基于这一数据存储特点,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]>