来补补底层知识?Redis基础数据结构
Redis的hash相当于Java的HashMap,无序字典
内部结构实现:数据加链表
第一维hash的数组碰撞后,将会将碰撞的元素用链表串起来
与Java中HashMap比较:Redis的字典值只能是string,rehash方式不同,Java的HashMap在字典很大时,rehash是个很耗时的操作,需要一次性全部rehash,Redis使用渐进式rehash策略,不堵塞服务。
渐进式rehash:在rehash的同时,保留了新旧两个hash结构,查询时会同时查询两个hash结构,然后在后续的定时任务以及hash操作指令中,循序渐进的将旧hash的内容迁移到新的hash结构中,当搬移完成了,新hash结构会取而代之
hash移除最后一个元素后,该数据结构自动被删除,内存被回收
hash结构也可以用来存储用户信息,string存储用户信息时需要全部序列化整个对象,hash可以对用户结构的每个字段单独存储,所以获取用户信息时就可以部分获取,可以节约网络流量。
hash缺点:hash结构存储消耗高于当个string
命令: 设置值:hset 键名 属性 属性值 取值:hgetall 键名 #entries()、hget 键名 属性名(取特定的属性值) 长度:hlen 键名
hash中单个属性值与string类似,可以进行自增 hincrby 键名 属性名 步长 incr 键名 属性名
set(集合)
=======
Redis的集合可以类比于Java中的HashSet,他的内部键值对是无序的、唯一的
内部实现:特殊的字典,字典的每个value值为NULL
当集合中最后一个元素被移除后,数据结构自动删除,内存被回收
使用场景(去重):存储活动中奖用户,通过去重,保证用户不会中奖两次
命令 设置值: sadd 键名 value(可以多个value) 取值:smembers 键名 取一个:spop 键名 某个value是否存在:sismember 键名 value 长度:scard 键名
zset(有序集合)
==========
Redis特有的数据结构,类似于Java中SortedSet和HashMap的结合体,set保证了value的唯一性,score代表value的权重,根据这个权重排序
内部实现:跳跃列表
zset最后一个value被移除后,数据结构被删除,内存被回收
应用场景(排序相关): 粉丝列表:value为ID,score为关注时间 学生成绩单:value为ID,score为成绩
命令 设置值:zadd 键名 权重 value 按权重排序列出:zrange 键名 start end (start end表示排序区间0 -1 表示所有) zrevrange 键名 start end 倒序 长度:zcard 键名 取某个值的权重score:zscore 键名 value 查看某个值的排名:zrank 键名 value 查看某个权重区间的值:zrangebyscore 键名 start end (start end 为权重区间) zrangebyscore 键名 -inf end withscores(-∞到end,并返回权重) 删除:zrem 键名 value
跳跃链表
====
zset内部实现:hash+跳跃链表
一个普通的链表查找元素的时间复杂度为O(N),即使单链表中的元素都是有序的,而数组可以利用二分查找的方法查找元素,面对有序的元素时,查找的时间复杂度为O(logn),而为了让链表查找效率更快,则出现了可以“二分查找”的链表:跳跃链表。
跳跃链表是一个有序的数据结构,每个节点维护了多个指向其他节点的指针,从而达到快速查找的目的。
当Redis中zset包含的元素比较多,或元素成员是比较长的字符串时,跳跃链表的优势会非常明显
跳跃链表可以理解为多层的链表
-
多层的结构组成,每层都是一个有序的链表
-
最底层(level 1)的链表包含了所有的元素
-
跳跃表的查找次数近似于层数,时间复杂度为O(logn),插入,删除也为O(logn)
-
跳跃表是一种随机化的数据结构(通过抛硬币的方式来决定层数)
-
跳跃表的空间复杂度为O(logn)
如何让有序的链表查找速度更快呢?查找 因为元素都是有序的,我们可以再增加一些路径来加快查找速度。 路径:多加一层隔一个排序的有序链表 通过对上一层的元素与查找元素的比较(二分查找),决定是否进入下一层查找。
如何维护这个链表呢?插入与删除 插入或删除时,跳跃表的节点树就会改变,意味着跳跃表的层数也会动态改变
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。


既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
发展有所帮助。
中高级开发必知必会:
[外链图片转存中…(img-DtckWxXM-1712477048480)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)