Redis原理深入理解

Redis原理深入理解

一、Redis的特点

  1. K-V键值对模型,(为什么设计成非关系型数据库,因为redis一般用来做缓存,数据不是全量的,不完整的数据是很难建立关系)
  2. Redis快:
    1. 基于内存,在内存中操作数据速度非常快。
    2. 采用IO多路复用技术,减少网络IO的时间消耗。
  3. 单线程(work单线程,I/O多线程)
  4. 支持并发,连接多(采用连接池 :I/O多路复用 epoll)
    1. 何为IO多路复用:多路指多个网络请求,复用是指复用同一个线程。让单线程高效处理多个连接请求,尽量减少网络IO的时间消耗。
    2. IO多路复用的实现:将用户线程轮询IO操作状态的工作统一交给一个专门的线程去做,异步通知。
  5. Value 有5种数据类型
  6. 具有本地方法,可对数据进行计算。
  7. 整体设计是串行化/原子性

二、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重新分配内存进行扩容。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值