当前位置: 首页 > news >正文

Redis之hash数据结构实现

 

参考 https://www.cnblogs.com/ourroad/p/4891648.html

https://blog.csdn.net/hjkl950217/article/details/78039691

 

在redis里,哈希又是另一种键值对结构。redis本身就是key-value型,哈希结构相当于在value里又套了一层kv型数据。哈希和C#里的字典,java里的map结构是一样的。

 

Redis一个重要的基础数据结构:dict。

  • dict是一个用于维护key和value映射关系的数据结构,与很多语言中的Map或dictionary类似。Redis的一个database中所有key到value的映射,就是使用一个dict来维护的。不过,这只是它在Redis中的一个用途而已,它在Redis中被使用的地方还有很多。比如,一个Redis hash结构,当它的field较多时,便会采用dict来存储。再比如,Redis配合使用dict和skiplist来共同维护一个sorted set

  • dict本质上是为了解决算法中的查找问题(Searching),一般查找问题的解法分为两个大类:一个是基于各种平衡树,一个是基于哈希表。我们平常使用的各种Map或dictionary,大都是基于哈希表实现的。在不要求数据有序存储,且能保持较低的哈希值冲突概率的前提下,基于哈希表的查找性能能做到非常高效,接近O(1),而且实现简单。

  • dict也是一个基于哈希表的算法。和传统的哈希算法类似,它采用某个哈希函数从key计算得到在哈希表中的位置,采用拉链法解决冲突,并在装载因子(load factor)超过预定值时自动扩展内存,引发重哈希(rehashing)。Redis的dict实现最显著的一个特点,就在于它的重哈希。它采用了一种称为增量式重哈希(incremental rehashing)的方法,在需要扩展内存时避免一次性对所有key进行重哈希,而是将重哈希操作分散到对于dict的各个增删改查的操作中去。这种方法能做到每次只对一小部分key进行重哈希,而每次重哈希之间不影响dict的操作。dict之所以这样设计,是为了避免重哈希期间单个请求的响应时间剧烈增加,这与前面提到的“快速响应时间”的设计原则是相符的。

 

内部编码
有两种:
ziplist
内部更加紧凑。
当键的个数小于hash-max-ziplist-entries(默认512)的配置时
同时所有值小于hash-max-ziplist-value(默认64)的配置时
才会使用ziplist
hashtable:
当不能使用ziplist时,就会使用这个结构,因为不满足上面两个条件时,ziplist的读写效率会降低。而hashtable的读写时间复杂度为O(1)。

 

转载于:https://www.cnblogs.com/marcocao/p/9907979.html

相关文章:

  • SCUT - G - 魔法项链 - 树状数组
  • SCUT - 482 - 生成树上的点 - Prufer
  • ACM算法相关资料
  • 洛谷 - P1462 - 通往奥格瑞玛的道路 - 二分 - Dijkstra
  • 洛谷 - P1522 - 牛的旅行 - Cow Tours - Floyd
  • wamp5环境配置基础教程
  • 模板 - Floyd
  • 这样的设计师,你们伤不起啊
  • 洛谷 - P1346 - 电车 - Dijkstra/01BFS
  • 图文解析五大外链误区
  • js中字符串操作函数
  • vsftpd每个虚拟用户的不同目录
  • 模板 - Prim
  • 关于网站从Window 2003移动到windows 2008
  • 模板 - 强连通分量 - Kosaraju
  • SegmentFault for Android 3.0 发布
  • 收藏网友的 源程序下载网
  • [Vue CLI 3] 配置解析之 css.extract
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • eclipse的离线汉化
  • fetch 从初识到应用
  • JSDuck 与 AngularJS 融合技巧
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • python3 使用 asyncio 代替线程
  • Python爬虫--- 1.3 BS4库的解析器
  • Spark RDD学习: aggregate函数
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 阿里研究院入选中国企业智库系统影响力榜
  • 百度地图API标注+时间轴组件
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 为什么要用IPython/Jupyter?
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • ​configparser --- 配置文件解析器​
  • ​Java并发新构件之Exchanger
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #NOIP 2014#Day.2 T3 解方程
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (转)平衡树
  • (转载)虚函数剖析
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • *2 echo、printf、mkdir命令的应用
  • ./configure,make,make install的作用
  • .Net Memory Profiler的使用举例
  • .net反混淆脱壳工具de4dot的使用
  • .NET企业级应用架构设计系列之结尾篇
  • .NET实现之(自动更新)
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [C++]四种方式求解最大子序列求和问题
  • [C++随笔录] 红黑树
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • [git]git命令如何取消先前的配置