Redis Hash哈希(2)
存储类型 包含键值对的无序散列表。value只能是字符串,不能嵌套其他类型。 同样是存储字符串,Hash与String的主要区别? 1、把所有相关的值聚集到一个key中,节省内存空间 2、只使用一个key,减少key冲突 3、当需要批量获取值的时候,只需要使用一个命令,减少内存/IO/CPU的消耗 Hash不适合的场景: 1、Field不能单独设置过期时间 2、没有bit操作 3、需要考虑数据量分布的问题(value值非常大的时候,无法分布到多个节点) 存储(实现)原理 Redis的Hash本身也是一个KV的结构,类似于Java中的HashMap。 外层的哈希(RedisKV的实现)只用到了hashtable。当存储hash数据类型时,我们把它叫做内层的哈希。内层的哈希底层可以使用两种数据结构实现: ziplist:OBJ_ENCODING_ZIPLIST(压缩列表) hashtable:OBJ_ENCODING_HT(哈希表) 执行命令 ziplist压缩列表 ziplist是一个经过特殊编码的双向链表,它不存储指向上一个链表节点和指向下一个链表节点的指针,而是存储上一个节点长度和当前节点长度,通过牺牲部分读写性能,来换取高效的内存空间利用率,是一种时间换空间的思想。只用在字段个数少,字段值小的场景里面。 ziplist的内部结构 ziplist.c源码第16行的注释: