Redis底层是靠C语言实现的,想看源码实现直接看src下的代码即可。核心就是server.h,redisDb以及redisObject就是在server.h中。
typedef struct redisDb {
dict *dict;
dict *expires;
dict *blocking_keys;
dict *ready_keys;
dict *watched_keys;
int id;
long long avg_ttl;
unsigned long expires_cursor;
list *defrag_later;
} redisDb;
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS;
int refcount;
void *ptr;
} robj;
学过C的都晓得,C语言存储字符串,是 char data[] 数组形式。 eg: char data[]=“guojia\0”; \0表示结束 如果有一个字符串guo\0jia,正常结果应该是guojia,但是由于有换行符,就有可能变为guo.这就有可能导致数据不准确,所以redis自定义了字符串:
SDS :simple dynamic string
特点:
- 1、二进制安全的数据结构
- 2、提供了内存预分配,避免了频繁的内存分配
- 3、兼容C语言函数库
扩容方式:
二倍扩容(空间换时间)
sds: free:0 空余空间为0 len:6 使用空间为6 char buf[]=“huohuo” ->“huohuo123”
修改后的结果为:huohuo123,需使用9个空间
len:6 addlen:3 (len+addlen)*2=18个字节
free:9 len:9 char buf[]=“huohuo123”
由于剩余空间还为9,再次修改,空间够用不会扩容,空间不够将会再次2倍方式扩容。 什么场景下不会采用二倍扩容方式? 当len长度达到1M的时候,也就是1024*1024的长度
reidsDb有多少DB?
0-15,一共16个redisDb
C底层关系图解
|