服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - Redis源码之Hash结构的实现

Redis源码之Hash结构的实现

2021-09-28 22:56程序员小饭饭米粒 Redis

hash和string类型到底有啥本质的区别?其实我们从源码可以看出来, 对于string类型来说,string类型是基于RedisDb的,如果string的数量不断的变多,就会导致dictht部分不断的rehash。

Redis源码之Hash结构的实现

redis的hash的基本命令暂时先不多说,我们直接步入正文 在redis的hash结构中,存在这样一种现象

  1. 127.0.0.1:6379> hset user:001 name john age 25 sex man 
  2. (integer) 3 
  3. 127.0.0.1:6379> hgetall user:001 
  4. 1) "name" 
  5. 2) "john" 
  6. 3) "age" 
  7. 4) "25" 
  8. 5) "sex" 
  9. 6) "man" 

我们先给user:001分别设置了name,age,sex属性,然后通过hgetall获取所有属性,这一切看起来还比较正常 但是接下来

  1. 127.0.0.1:6379> hset user:002 name john age 25 sex man extra xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  2. (integer) 4 
  3. 127.0.0.1:6379> hgetall user:002 
  4. 1) "name" 
  5. 2) "john" 
  6. 3) "extra" 
  7. 4) "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
  8. 5) "sex" 
  9. 6) "man" 
  10. 7) "age" 
  11. 8) "25" 

我们给user:002多设置了一个extra属性,并且设置的值比较大,然后用hgetall获取所有属性的时候发现返回的顺序不是按照我们设置的时候的属性的顺序了,这是为什么呢?

其实主要原因是:hash数据结构底层实现为一个字典(dict),也是redisDb用来存储k-v的数据结构,当数据量比较小,或者单个元素比较小的时候,底层用ziplist存储,数据大小和元素数量阈值可以通过如下参数设置

hash-max-ziplist-entries 512 //ziplist元素个数超过512,将改为hashtable编码 hash-max-ziplist-value 64 //单个元素大小超过64byte时,将改为hashtable编码 对于上面的例子,主要是因为单个元素大小超过了64byte,所以改为了hashtable编码,导致了hgetall获取属性的时候和设置的顺序不一样

压缩表的结构

Redis源码之Hash结构的实现

其实很多同学也有一个疑问,hash和string类型到底有啥本质的区别?其实我们从源码可以看出来, 对于string类型来说,string类型是基于RedisDb的,如果string的数量不断的变多,就会导致dictht部分不断的rehash

Redis源码之Hash结构的实现

而对于hash类型的来说,hash不存在dictht不断rehash的问题

Redis源码之Hash结构的实现

但是其实也是各有利弊,比如hash就没法对某个key设置过期时间,而且redis中有一个很大的忌讳,就是不要让某个key过大,容易阻塞,所以个人还是更推荐string的方式

原文链接:https://mp.weixin.qq.com/s/XR5FuIuPktUdUStm-PGYAQ

延伸 · 阅读

精彩推荐
  • RedisRedis面试题常见问答

    Redis面试题常见问答

    通常,我们会使用缓存用于缓冲对 DB 的冲击,如果缓存宕机,所有请求将直接打在 DB,造成 DB 宕机——从而导致整个系统宕机。...

    民工哥技术之路3082020-07-18
  • Redis简单实用!利用Redis轻松实现高并发全局ID生成器

    简单实用!利用Redis轻松实现高并发全局ID生成器

    Redis作为高性能的KV数据库,并且操作还是原子性的,所以用来做支持高并发的发号器十分合适。 本文给大家介绍3种常见的全局ID生成方式。 1、全局递增...

    未知802023-05-07
  • RedisRedis如何实现分布式锁

    Redis如何实现分布式锁

    相信大家对锁已经不陌生了,本文主要介绍了Redis如何实现分布式锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参...

    公众号程序员学长11082021-09-17
  • RedisRedis挂了,流量把数据库也打挂了,怎么办?

    Redis挂了,流量把数据库也打挂了,怎么办?

    Redis 挂了,不就是缓存都没了吗?缓存都没了,不就是缓存雪崩了吗?缓存雪崩了,不就导致数据库挂了吗?一提到“缓存雪崩”这四个字,缓存穿透、缓存击...

    why技术8672021-08-11
  • Redis浅谈Redis中的内存淘汰策略和过期键删除策略

    浅谈Redis中的内存淘汰策略和过期键删除策略

    本文主要介绍了浅谈Redis中的内存淘汰策略和过期键删除策略,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    纪先生9002021-11-14
  • Redis一次关于Redis内存诡异增长的排查过程实战记录

    一次关于Redis内存诡异增长的排查过程实战记录

    这篇文章主要给大家分享了一次关于Redis内存诡异增长的排查过程实战记录,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学...

    付磊2962019-11-15
  • Redis使用Redis实现用户积分排行榜的教程

    使用Redis实现用户积分排行榜的教程

    这篇文章主要介绍了使用Redis实现用户积分排行榜的教程,包括一个用PHP脚本进行操作的例子,需要的朋友可以参考下 ...

    Redis教程网4572019-10-23
  • RedisWindows下Redis的安装使用教程

    Windows下Redis的安装使用教程

    这篇文章主要以图文结合的方式为大家详细介绍了Windows下Redis的安装使用,Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对...

    CSDN3952019-10-29