<>Redis常用数据类型

Redis常用数据类型包括:String、Hash、List、Set、ZSet

<>redis的数据模型

dictEntry
在一些编程语言中,键值对的数据结构被称为字典,而在 Redis 中,会给每一个 key-value
键值对分配一个字典实体,就是“dicEntry”。dicEntry 包含三部分: key 的指针、val 的指针、next 指针,next 指针指向下一个
dicteEntry 形成链表,这个 next 指针可以将多个哈希值相同的键值对链接在一起,通过链地址法来解决哈希冲突的问题。
SDS
Simple Dynamic String,简单动态字符串,存储字符串数据。
redisObject
Redis 的 5 种常用类型都是以 RedisObject 来存储的,redisObject 中的 type 字段指明了值的数据类型(也就是 5
种基本类型)。ptr 字段指向对象所在的地址。Redis 对象的类型、内部编码、内存回收、共享对象等功能,都是基于 RedisObject 对象来实现的。

<>内存分配器

**jemalloc **
Redis 将 jemalloc 作为默认内存分配器,减小内存碎片。jemalloc 在 64
位系统中,将内存空间划分为小、大、巨大三个范围;每个范围内又划分了许多小的内存块单位;当 Redis 存储数据时,会选择大小最合适的内存块进行存储。

<>常用数据类型的数据结构

<>String

Redis 中的字符串被称为简单动态字符串「SDS」,这种结构很像 Java 中的 ArrayList,其长度是动态可变的。字符串的编码类型有
int、embstr 和 raw 三种。
struct SDS { T capacity; // 数组容量 T len; // 数组长度 byte[] content; // 数组内容 }
int
保存的是可以用 long 类型表示的整数值。
embstr
保存长度大于 44 字节的字符串(redis3.2 版本之前是 39 字节,之后是 44 字节)。
row
保存长度小于 44 字节的字符串(redis3.2 版本之前是 39 字节,之后是 44 字节)。
39字节为什么变成44字节
长度变化的原因是 SDS
中内存的优化。redis内存分配器将小于等于64字节的对象归为小对象,SDS中除content外的,其它字段占用的内存少了,导致可分配给content数组的空间大了。

测试
127.0.0.1:6379> set num 300 127.0.0.1:6379> object encoding num "int" 127.0.0.1
:6379> set key1 wealwaysbyhappyhahaha OK 127.0.0.1:6379> object encoding key1
"embstr" 127.0.0.1:6379> set key2 hahahahahahahaahahahahahahahahahahahaha OK
127.0.0.1:6379> strlen key2 (integer) 39 127.0.0.1:6379> object encoding key2
"embstr" 127.0.0.1:6379> set key2 hahahahahahahaahahahahahahahahahahahahahahaha
OK127.0.0.1:6379> object encoding key2 "raw" 127.0.0.1:6379> strlen key2 (
integer) 45
<>List

list使用quickList实现,老版本中,list使用ziplist压缩列表或linkedlist双端列表实现。
ziplist

在列表数据量少的时候,使用ziplist实现。各元素以数组的形式存在,是仅挨着的,不需要记录前后元素等内存开销,所以节省内存。由于数据量少,即使从中间某个位置插入,也非常快。
linkedlist

双端列表像Java的linkedList,随着数据量的增大,如果依然使用ziplist,从中间插入元素需要的开销也越来越大,因此,使用链表的方式,性能更好。包含前后指针,头尾指针等。但是比较费空间。
quickList

quickList从时间和空间上都达到了极致。quicklist是由ziplist组成的双向链表,链表中的每一个节点都以压缩列表ziplist的结构保存着数据,而ziplist有多个entry节点,保存着数据。相当与一个quicklist节点保存的是一片数据,而不再是一个数据。

<>Hash

Hash 数据类型的底层实现是 ziplist或字典(也称为 hashtable)。这里压缩列表或者字典的选择,也是根据元素的数量大小决定的。

当数据量小的时候,使用ziplist,当数据量大的时候,使用字典。

使用ziplist的条件:

* 哈希中元素数量小于 512 个
* 哈希中所有键值对的键和值字符串长度都小于 64 字节
hashtables 类似于 jdk1.7 以前的 hashmap。hashmap 采用了链地址法的方法解决了哈希冲突的问题。

<>Set

Set 数据类型的底层可以是 intset(整数集)或者是 hashtable。

当数据都是整数并且数量不多时,使用 intset 作为底层数据结构;当有除整数以外的数据或者数据量增多时,使用 hashtable 作为底层数据结构。

intset 底层实现为有序、无重复数的数组。
typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length
; // 保存元素的数组 int8_t contents[]; } intset;
<>Zset

Redis 中的 Zset,也叫做有序集合。它的底层是 ziplist或 skiplist(跳跃表)。

在元素数量比较少的时候ziplist,在元素多的时候使用跳表。

跳表利用了二分的思想,最底层存储了所有的元素,每上一层,概率上减少一半元素。除底层外,每一层元素都有指向同层前后节点和下一层同节点的指针。这样基于链表的“二分查找”支持快速的插入、删除,时间复杂度都是
O(logn)。

zadd—zslinsert—平均 O(logN), 最坏 O(N)
zrem—zsldelete—平均 O(logN), 最坏 O(N)
zrank–zslGetRank—平均 O(logN), 最坏 O(N)

技术
©2019-2020 Toolsou All rights reserved,
大一上c语言学生管理系统(下)年底了,不要跳槽。字节跳动测试工程师凉经分享教你用Python画一棵圣诞树用C实现圣诞树python 使用turtle 画樱花(python3验证ok)win10系统的计算机C盘在哪,c盘users在哪(win10c盘找不到users)计算机发展史上最著名的两位鼻祖HDFS主要组件(数据块、NameNode、DataNode、secondaryNameNode)python 指定时间运行代码