一、动态字符串
Redis 中都是字符串进行存储,没有采用C语言的字符串进行存储,构建了一种新的字符串结构,SDS simple Dynamic String。
C语言结构体定义SDS,有很多种不同长度的SDS,避免内存浪费。
SDS结构:
是可以动态变化长度的
小于1M 分配两倍 + 1
大于1M分配 字符串长度 + 1 M + 1 , 内存预分配。
二进制安全是指 遍历到\0
时不会停下来
二、IntSet
升序排列
自动升级,倒序拷贝到正确的位置。
在自动升级的时候,插入的数字要么是最大的,要么是最小的,一定是在两边进行操作。
三、Dict
键和值是通过Dict进行实现的,
三部分构成,哈希表,哈希节点,字典
DIct扩容
当哈希冲突多了之后,就会退化成链表,查询性能下降。
ZipList
没有通过指针来记录前后的节点,只是通过计算偏移量来计算就可以。
0 - 12直接存储
能够减少指针的内存空间
连锁更新问题,插入的节点大于254字节,这个时候所有的存储单元都要往后移动,进行改变。
QuickList
ziplist 比较占用内存,尤其是要申请一片连续的内存空间的时候,是困难的,分片存储ziplist,限制每个ziplist的大小。
上图中首尾不压缩,其他节点进行压缩。
SkipList
跳表,多个指针,不再指向以前紧跟着的节点了,跨度比较大。最大能有32个指针,2^31
ele是数据
RedisObject
每一个Object都是一个数据,如果都是string类型的话,占用空间是最大的,因为一个string需要存储其他的编码方式,lru等等。
HT 哈希表
String
RAW先申请头的内存,再申请存储空间的内存。
三种类型
List
set
每次添加新的元素的时候,都会去检查是否是数字类型,如果不是的话,那么就要转化成HT编码
zset
Hash
内核空间 用户空间
都是要经过缓冲区进行缓冲
阻塞IO
非阻塞IO
没什么用
IO多路复用
select
select性能相对较差
poll
epoll
FT ET
LT 存在性能上的问题
RESP协议
单行字符串 结尾标识,二进制不安全,返回结果OK
Redis内存策略
淘汰策略
在执行命令之前尝试做内存是否异常