Redis抄作业
前几天整理到redis的一些特性,顺便跟着公开课看了下源码,
说到redis的时候,我说redis有几个库,小伙伴说有16个,我说HashMap的初始容量是多少?小伙伴说是16,我说redis抄HashMap的作业你们同不同意,他们说还有点意思,还挺方便记,另外,同为K,V形式存储数据,底层数据结构从维度上讲,1.8之前都是数组+链表,redis的数据结构组成了hashtable,redis的rehash,HashMap的resize,你这作业抄的有点厉害啊。
其实功能根本不是一个类别,为了说抄作业是方便记忆,这样类比下来,还有点相似。redis的作用还是主要用于缓存,而为什么使用redis,还要从性能和并发两方面讨论,至于分布式锁,大家观点不一,有的偏爱zookeeper。有的喜欢redis,并不是主要用途,git上拉一下6.0的源码,可阅读redis.conf翻译查阅。另外强一致性的数据不适合放入redis。
非关系型数据库VS关系型数据库?
啥叫关系型数据库?(能够互相连接的列表式数据库),非关系型相反。即non-relational
hash数据结构
哈希等价于Java语言的HashMap或者是Python语言的字典(Dict)redis hash 的内部结构.第一维是数组,第二维是链表.组成一个 hashtable
redis初始创建hash表,有序集合,链表时, 存储结构采用一种ziplist的存储结构, 这种结构内存排列更紧密, 能提高访存性能.
hash_max_ziplist_entries和hash_max_ziplist_value值作为阀值,hash_max_ziplist_entries表示一旦ziplist中元素数量超过该值,则需要转换为dict结构;hash_max_ziplist_value表示一旦ziplist中数据长度大于该值,则需要转换为dict结构。
redis3.2以前Hash存储 每一个数据有指向下一个数据的指针
redis的type都是Stirng类型的,但是encoding int row 类型
redis3.2以前 String的表示为sdshdr
缺点:存储非常短的字符,需要占用大内存
redis3.2以后
来自网易云课堂公开课
ziplist数据结构是对链表的一个优化,不会产生碎片,节省空间
preawlen 前节点长度
每个entry len 当前节点长度
data 真正的数据
链表指针会占用空间,松散存储,会产生碎片
当数据量大的时候,链表拷贝效率低
双向链表 分桶设计
rehash
在 Java 中 HashMap 扩容是个很耗时的操作,需要去申请新的数组,为了追求高性能,Redis 采用了渐进式 rehash 策略.这也是 hash 中最重要的部分.
在扩容的时候 rehash 策略会保留新旧两个 hashtable 结构,查询时也会同时查询两个 hashtable.Redis会将旧 hashtable 中的内容一点一点的迁移到新的 hashtable 中,当迁移完成时,就会用新的 hashtable 取代之前的.当 hashtable 移除了最后一个元素之后,这个数据结构将会被删除.
与java的hashmap的rehash区别
个人理解:hashmap的rehash是一次性拷贝的,不同的是,Redis的字典只能是字符串,另外他们rehash的方式不一样,因为Java的HashMap的字典很大时,rehash是个耗时的操作,需要一次全部rehash。Redis为了追求高性能,不能堵塞服务,所以采用了渐进式rehash策略。
rehash的详细步骤
https://www.cnblogs.com/meituantech/p/9376472.html
rehash存储数据量过大时会导致CPU飙升,HashMap1.8之前的resize会发生死循环。
- 点赞
- 收藏
- 关注作者
评论(0)