Redis(七):列表对象与哈希对象,关于网络优化你必须要知道的重点-程序员宅基地

技术标签: 2024年程序员学习  哈希算法  数据库  redis  

quicklist

quicklist结构是在redis 3.2版本中新加的数据结构,用在列表的底层实现。

出现了quicklist后,ziplist与linkedlist就不用了

quicklist总体来说是ziplist与linkedlist的合体,拥有两者的优点

quicklist优点

quicklist其实是linkedlist,但里面结点的不再是一个SDS字符串对象,而是一个ziplist,之前的ziplist之所以会变成linkedlist,是因为长度太长引起的连锁更新消耗资源多,使用了quicklist后,将ziplist分开成了一段一段(用结点去分),虽然也会发生连锁更新,但只是在结点里一小部分的ziplist发生连锁更新,提高了插入删除的性能。

在这里插入图片描述

哈希对象


哈希对象的编码可以是ziplist或者hashtable

使用ziplist(压缩列表)作为底层实现

ziplist编码的哈希对象可以使用压缩列表作为底层实现,实现方式为先插入以键值形成的结点,再插入以value值形成的结点,键值对的保存形式其实就是相邻的结点,每当有新的键值对要加入到哈希对象时,程序会先将保存了键的压缩列表结点推入到压缩列表的表尾,然后再将保存了值的压缩列表结点推入到压缩列表表尾。因此会有下面的性质:

  • 保存了一个键值对需要使用两个相邻结点,保存键的结点在前,保存值的结点在后

  • 插入的方式采用尾插法,先添加的键值对在表头处,后添加的键值对在表尾处

举个栗子

//执行下面的nosql

hset me name “ember” age 18

object encoding me

结果如下所示

在这里插入图片描述

分析以下它的过程吧

首先会根据"me"生成一个SDS对象作为键对象,然后根据后面的键值对生成redisObject对象,该对象如下图

在这里插入图片描述

使用hashtable(哈希表)作为底层实现

当哈希对象可以同时满足以下两个条件时,哈希对象会选用ziplist编码(与列表对象一样,当ziplist的连锁更新消耗不大时,使用ziplist)

  • 哈希对象保存的所有键值对道德键和值的字符串长度都小于64位

  • 哈希对象保存的键值对数量小于512个

  • 不能满足这两个条件的,即使满足了一个,也会改用hashtable编码

注意

这两个条件的上限值也是可以通过下面两个参数来修改的

  1. hash-max-ziplist-value(键值对数量)

  2. hash-max-ziplist-entries(结点最大长度)

下面就是一个ziplist转化为hashtable的栗子(结点长度太大,而发生转换)

在这里插入图片描述

哈希命令的实现

哈希键的值为哈希对象,所以哈希键的操作都是基于hash对象来构建的

| 命令 | ziplist编码 | hashtable编码 |

| — | — | — |

| HSET | 调用两次ziplistpush函数,先将键放入表尾,然后将值放入表尾 | 调用dictAdd函数,将新结点添加到字典里面去 |

| HGET | 调用ziplistFind函数,在压缩列表中查找指定键所对应的结点,然后调用ziplistNext函数,移动到键结点旁边的值结点,最后返回值结点 | 调用dictFind函数,在字典中查找键,然后调用dictGetVal函数,得到该键对应的值 |
| HEXISTS | 调用ziplistFind函数,在压缩列表中查找指定键所对应的结点,存在就返回1,不存在返回0 | 调用dictFind函数,在字典中查找指定的键,找到返回1,找不到返回0 |
| HDEL | 调用ziplistDel函数,在压缩列表中查找键所对应的结点,然后将相应的键结点以及旁边的值结点删除掉,找不到会报错 | 调用dictDelete函数,在字典中查找指定的键值对并删除 |
| HLEN | 调用ziplistLen函数,取得压缩列表中的总结点数,然后对总结点数除以2,返回该数 | 调用dictSize函数,返回字典包含的键值对数量 |

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

腾讯T3大牛总结的500页MySQL实战笔记意外爆火,P8看了直呼内行

腾讯T3大牛总结的500页MySQL实战笔记意外爆火,P8看了直呼内行
取:vip1024b (备注Java)**
[外链图片转存中…(img-NoMC0CZi-1712104500596)]

最后

[外链图片转存中…(img-LOVePIRI-1712104500597)]

[外链图片转存中…(img-A3TFBWvM-1712104500597)]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_83974590/article/details/137325316

智能推荐

html的class怎么使用方法,HTML的class属性怎么用?使用方法详细总结!-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏10次。我们在开发网页时有一个属性经常被用到,那就是 class。这篇文章 w3cschool 小编来为大家介绍下 HTML 的 class 属性怎么用。学习 class 看这篇文章就够了。class 属性怎么用?class 属性用来规定元素的类名,最常用在样式表上,JavaScript 上也有部分用到。顾名思义,class 是用来定义一种类的,它指定元素的分类,比如我们在样式表上设定一个类的属性,在 H..._htmlclass用法

第三次作业-程序员宅基地

文章浏览阅读46次。第三次作业提交列表第一题设计思路第一步:据题目要求,由给定的数字来返回月份,首先要定义一个字符数组来包含各个月份的英文名。第二步:通过遍历的方法来找出所对应的月份。第三步:根据要求,不是1-12的数字之外的输出“wrong input!”,便通过“if”条件语句进行判断来限制这个条件。代码#include <stdio.h>char *getmonth( int n..._struct listnode *readlist()

视频监控场景下报警功能的技术特点及场景应用_百度视频监控区域设定报警-程序员宅基地

文章浏览阅读777次。平台可实时查看设备在线、掉线等状态信息,并获取到设备的报警信息,同步的抓取到所有的设备记录的报警状态,将设备的报警级别、报警方式、报警类型报警时间都统一的展示出来。平台端也会根据设备的报警的信息进行视频的截取,获取到报警时刻的视频截图,从而实现设备管理、故障告警等功能。2、报警处理:支持多种报警处理方式,若报警为误报,可以进行报警忽略;1、自定义报警阈值:支持客户依据自身业务自定义报警阈值,可自定义内容包括:报警对象、报警类型、报警指标、报警阈值、报警等级、报警生效时间段、报警时间、报警方式及接收人等。_百度视频监控区域设定报警

java多线程、同步、异步_java线程同步和异步-程序员宅基地

文章浏览阅读3.8k次,点赞3次,收藏33次。java多线程_java线程同步和异步

荣耀路由x1 虚拟服务器,荣耀X1路由器怎么设置?-程序员宅基地

文章浏览阅读449次。在本文中,鸿哥将给大家详细介绍,用电脑设置荣耀X1路由器上网的方法。注意问题:(1)、大家注意一下,在本文中,介绍的是用电脑来设置荣耀X1路由器。如果你需要用手机来设置,请阅读下面的这篇教程:(2)、如果你的这台荣耀X1路由器已经可以上网了,需要修改它的wifi密码或者wifi名称,详细的操作步骤,请阅读下面的教程:(3)、如果你的这台荣耀X1路由器已经配置过了,但是由于一些原因,它现在仍然无法上..._华为x1路由器设置

圆为什么规定一定是360度_为什么圆要分成360度?-程序员宅基地

文章浏览阅读3.6k次。4.5万6因为把圆分成360度,是自然存在规律的实在体现,而非人为意识的发明。人为意识做到的只能是发现而表现出来。要说为什么把圆分成为360度呢,实际上首先需要把圆作为36度来进行梳理,360度只是36度的细分。那么圆为什么是以36数来作为它的周长呢?因为圆象为“”态,用中国人的观点来看,它也就是人们意识中无形气的表象。而气在中华民族传统文化中则体现为5行之气。由于其存在於内,所以其(气)值则为0..._为什么圆是360度

随便推点

Java线程池核心线程数与最大线程数的区别_核心线程数和最大线程数-程序员宅基地

文章浏览阅读2.9w次,点赞37次,收藏100次。核心线程corePoolSize:核心线程数;maximunPoolSize:最大线程数每当有新的任务到线程池时,第一步: 先判断线程池中当前线程数量是否达到了corePoolSize,若未达到,则新建线程运行此任务,且任务结束后将该线程保留在线程池中,不做销毁处理,若当前线程数量已达到corePoolSize,则进入下一步;第二步: 判断工作队列(workQueue)是否已满,未满则将新的任务提交到工作队列中,满了则进入下一步;第三步: 判断线程池中的线程数量是否达到了maxumunPoolSi_核心线程数和最大线程数

HTML5表单美化_html datalist 美化-程序员宅基地

文章浏览阅读6.3k次,点赞2次,收藏7次。[转载]利用 HTML5 美化表单对表单感兴趣的人并不多,但 HTML5 引入的一些重大改进却同时方便了创建表单的开发人员和填写表单的用户。全新的表单元素、属性、输入类型、基于浏览器的验证、CSS3 样式技术以及 FormData 对象让创建表单变得更轻松,甚至可能更富有趣味性。There is even more up to date forms guidance on our _html datalist 美化

Church's Coupon Performance Test Script_api.nnys868.work-程序员宅基地

文章浏览阅读7w次。 2015年6月针对church's coupon app做了并发压力测试,HP LR在11.5版本第一次支持在移动设备的录制对Server压力测试。也是本人第一次在移动设备上压力测试实践。工具使用的是 HP LoadRunner 12.02 Community Edition。(社区版可以免费支持50个虚拟用户并发,此版本工具当时是最新版,尚没有任何破解的license)LoadRunne..._api.nnys868.work

AtCoder题解——Beginner Contest 178——F - Contrast_given are two sequences a and b, both of lengt-程序员宅基地

文章浏览阅读582次。题目相关题目链接AtCoder Beginner Contest 178 F 题,https://atcoder.jp/contests/abc178/tasks/abc178_f。Problem StatementGiven are two sequences A and B, both of length N. A and B are each sorted in the ascending order. Check if it is possible to reorder the te_given are two sequences a and b, both of length n. a and

总结:IP地址、网络地址与子网掩码的理解-程序员宅基地

文章浏览阅读3w次,点赞47次,收藏303次。一、IP地址电脑之间要实现网络通信,就必须要有一个合法的ip地址。IP地址=网络地址+主机地址,(又称:主机号和网络号组成)ip地址的结构使我们可以在Internet上很方便的寻址。ip地址通常用更直观的,以点分十进制表示,每个数字从0到255,如某一台主机的ip地址为:128.20.4.1。在局域网里,同样也需要ip地址,一般内网的ip地址是以192.168开头的,这样很容易区分公网和内网的ip地址。【注】网络地址也叫做网络位置、网络号、网段、子网IP,都是描述属于哪个子网的同义词。【_网络地址

单片机的单个IO口可以发送数据吗_5分钟了解单片机数据、地址、控制总线结构...-程序员宅基地

文章浏览阅读845次。一、总线概述计算机系统是以微处理器为核心的,各器件要与微处理器相连,且必须协调工作,所以在微处理机中引入了总线的概念,各器件共同享用总线,任何时候只能有一个器件发送数据(可以有多个器件同时接收数据) 。计算机的总线分为控制总线、地址总线和数据总线等三种。而数据总线用于传送数据,控制总线用于传送控制信号, 地址总线则用于选择存储单元或外设。二、单片机的三总线结构51系列单片机具有完善的总线接口时序,..._数据总线 地址总线 io口