[redis] hashmap数据结构

[redis] hashmap数据结构一、描述

大家好,又见面了,我是你们的朋友全栈君。

一、描述

redis的其中一个数据类型为hashmap,即散列表

正常实现hashmap:

1.分配固定大小的桶,大小为n

2.计算key的hash值,并且与n取模,得到在桶的索引位置index

3.根据2中计算的index,然后存放在对应的桶中

4.当遇到碰撞情况,则会通过链表来解决碰撞问题

二、redis中数据结构定义

[redis] hashmap数据结构

struct dictht:为hash table的实际实现结构

struct dict:为hash table的外层封装,主要一个作用是当当前使用dictht需要进行rehash的时候,其会创建新的dictht,并且会在词请求的时候,完成一部分的搬运工作

[redis] hashmap数据结构

struct dictEntry:为每个桶,其中的next为解决冲突的链表

三、rehash:

redis的散列表和正常的散列表实现没有太大区别,唯一的区别是在rehash-即需要重新扩容的情况有所区别

正如我们所知,redis是单进程单线程模式,那么对于rehash如果一次性完成数据的搬运的,在数据量大的时候,会是

很耗时的操作,因此redis并不是一次性搬运完所有的数据,而是在每次请求的时候,都会触发搬运工作,

但是搬运的数据都是一小部分而已。

1.lazy rehash,每次操作dict的时候,会搬运一个slot到新的hashmap

2.active rehash,每过一段时间便会进行数据的搬运

四、小点:

在使用hashmap的时候,并不是说每次redis都会直接用散列表的方式来存储数据,因此在单独使用key-value,value作为hashmap使用的时候,

很可能只是用于存放简单而且少量的数据,因此处于对内存消耗和性能等综合考量,在一开始redis会通过ziplist(压缩双向链表来存储数据)相关链接

而控制什么时候会采用hashmap来存储,可以通过参数来控制:

hash-max-ziplist-entries 512(ziplist最大存储entry的数量)

hash-max-ziplist-value 64(ziplist最大一个entry存储的字节数)

凡是超过这两个限制,都会讲ziplist转换为hashmap

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144718.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 闲话IS-IS路由协议之一:认证实现问题

    闲话IS-IS路由协议之一:认证实现问题

    2021年8月19日
    54
  • next()和nextLine()的区别详解

    next()和nextLine()的区别详解//next()和nextLine()的区别详解/*next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其过滤掉;只有在读取到有效字符之后,next()方法才将其后的空格键、Tab键或Enter键等视为结束符;所以next()方法不能得到带空格的字符串。 *//*nextLine()方法字

    2022年5月29日
    33
  • jvm触发full gc条件(Linux内存管理机制)

    1、Java垃圾回收机制GC,即就是Java垃圾回收机制。目前主流的JVM(HotSpot)采用的是分代收集算法。作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题。与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用。即:从gcroot开始,把所有可以搜索得到的对象标记为存活对象。缺点就是:1.有可能不知不…

    2022年4月12日
    78
  • 行为识别Action Detection概述及资源合集(持续更新…)「建议收藏」

    行为识别Action Detection概述及资源合集(持续更新…)「建议收藏」随着深度学习技术的发展,以及计算能力的进步(GPU等),现在基于视频的研究领域越来越受到重视。视频与图片最大的不同在于视频还包含了时序上的信息,此外需要的计算量通常也大很多。这篇主要介绍ActionRecognition(行为识别)这个方向。这个方向的主要目标是判断一段视频中人的行为的类别,所以也可以叫做HumanActionRecognition。虽然这个问题是针对视频中人的动作,但基…

    2022年6月21日
    34
  • hashmap动态扩容死循环_HashMap扩容

    hashmap动态扩容死循环_HashMap扩容HashMap扩容死循环问题源码分析问题(jdk1.7)一、首先hashmap单线程正常扩容遍历每个数组,依次遍历每个数组的链表,根据头插法由原来的1,2,3变为了3,2,1二、hashmap多线程扩容死循环问题两个线程e1,e2此时线程一先执行,但线程二的指向发生改变,改为线程变换后的具体存储;初始的e2指向0号位的1,但经过线程一的变换指向了2号位的1了,next也发生改变线程二开始在线程一的基础存储,当next2指向空时。e.next=newTable[i],也就

    2022年9月21日
    1
  • CultureInfo 类

    CultureInfo 类CultureInfo类 提供有关特定区域性的信息(如区域性的名称、书写系统和使用的日历)以及如何设置日期和排序字符串的格式。命名空间:System.Globalization程序集:mscorlib(在mscorlib.dll中)varExpCollDivStr=ExpCollDivStr;ExpCollDivStr=ExpCollDiv

    2022年6月19日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号