Redis原理深入理解
一、Redis的特点
- K-V键值对模型,(为什么设计成非关系型数据库,因为redis一般用来做缓存,数据不是全量的,不完整的数据是很难建立关系)
- Redis快:
- 基于内存,在内存中操作数据速度非常快。
- 采用IO多路复用技术,减少网络IO的时间消耗。
- 单线程(work单线程,I/O多线程)
- 支持并发,连接多(采用连接池 :I/O多路复用 epoll)
- 何为IO多路复用:多路指多个网络请求,复用是指复用同一个线程。让单线程高效处理多个连接请求,尽量减少网络IO的时间消耗。
- IO多路复用的实现:将用户线程轮询IO操作状态的工作统一交给一个专门的线程去做,异步通知。
- Value 有5种数据类型
- 具有本地方法,可对数据进行计算。
- 整体设计是串行化/原子性
二、Redis对象
(一)Redis对象类型
摘要:redis对象面向开发人员的5种基本数据类型,字符串(REDIS_STRING)、列表(REDIS_LIST)、哈希(REDIS_HASH)、集合(REDIS_SET)、有序集合(REDIS_ZSET)。这五种数据类型都分别有两种底层实现。
1. 字符串(redis_string)
(1)整数值字符串(redis_encoding_int)
(2)简单动态字符产(SDS)实现(redis_encoding_embstr和redis_encoding_raw)
2.列表(redis_list)
(1)压缩列表(redis_encoding_ziplist)
(2)双端链表(redis_encoding_linkedlist)
3.哈希(redis_hash)
(1)压缩列表(redis_encoding_ziplist)
(2)字典表(redis_encoding_ht)又称哈希表
4.集合(redis_set)
(1)整数集合实现(redis_encoding_intset)
(2)字典表(redis_encoding_ht)又称哈希表
5.有序集合(redis_zset)
(1)压缩列表(redis_encoding_ziplist)
(2)跳跃表(redis_encoding_skiplist)
(二)应用场景
1. 字符串(redis_string)
2.列表(redis_list)
3.哈希(redis_hash)
4.集合(redis_set)
共同关注的人:交集
可能关注的人:差集
5.有序集合(redis_zset)
(三)Redis对象类型的底层实现
1.SDS(简单动态字符串)
定义:简单动态字符串采用字符数组保存字符串,实现类似java中的ArrayList数组,提前分配冗余空间,减少内存的频繁分配。
数据结构:
struct sdshtr {
int len;// 记录字符串长度
int free;// 记录数组中未使用的字节数。
char buf[];// 存放字符产
}
优势:相比C语言的字符串,可以杜绝缓冲区溢出。
len;// 记录字符串长度
int free;// 记录数组中未使用的字节数。
char buf[];// 存放字符产
}
优势:相比C语言的字符串,可以杜绝缓冲区溢出。
因为SDS中有free记录未使用的空间大小,采用该字段可以实现空间预分配和惰性空间释放两种优化策略。当空闲空间不足以放下将要放入的字符串,则会进行refresh重新分配内存进行扩容。