SDS
simple dynamic string
redis 3.2以前
1 | struct sdshdr { |
redis3.2以后
1 | typedef char *sds; |
对sdshdr做了优化和细分;
内存对齐:
key类型
string
值类型
string,hash,set, sorted set,list
- K-V: 是一个dict数据类型。
海量数据的存储:
- 数组: O(1)
- 链表: O(N)
- 树: long(N)
arr[4]
hash(key) -> 自然数%4 。变成索引。
hash(k1) % 4 = 0
hash(k2) % 4 = 1
hash(k3) % 4 = 1
arr[0] -> (k1, v1,next -> null)
arr[1,2] -> (k3, v3, next -> k2) (k2, v2, next -> null)
当数组容量很大时,hash碰撞加剧。数据结构由数组变成了链表,时间复杂度从O(1)退化成
O(N) 此时需要进行扩容。
k2,k3碰撞了怎么办?
- 开放地址法。
- 链表法
- 头插法(redis使用的方式)
redisDB的设计
redis总共16个Db 索引从0-15
1 | typedef struct redisDb { |
扩容方法 。原有容量 *2.
rehash迁移方式:1. 渐进式迁移。2. 定时迁移。
set xxx // set是对 string操作。所以 type xxx也是string
lpush xxx // lpush 操作 type xxx 是list