写在前面
- 这里主要记录一下Redis的框架原理;
一、Redis概述
1. 定义
- 是一种基于内存的数据库;
- 对数据的读写操作都是在内存中完成的;
2. 特点
-
(1) 高性能:
- 直接在内存读写,速度非常快;
-
(2) 高并发:
- 采用I/O多路复用机制,可以用一个线程处理多个I/O流;
- Redis6.0后,采用多个I/O线程处理网络请求;
二、数据类型
- Redis支持的五种常用的value数据类型如下:
- String:字符串;
- Hash:哈希;
- List:列表;
- Set:集合;
- Zset:有序集合;
1. String
- 可以存放字符串或者数字(整数或者浮点数);
- 最大数据长度是
512M
;
1.1 内部实现
- 使用
int
和简单动态字符串SDS
;
-
有三种编码方式:
int
:保存可以用long
类型表示的整数;embstr
:保存小于等于32
字节的短字符串;raw
:保存大于32
字节的长字符串;
-
(1)
int
只需要保存redisObject
和整数即可:
- (2)
embstr
的redisObject
和SDS
空间是连续分配的:
- (3)
raw
的redisObject
和SDS
空间是分别分配的;
1.2 应用场景
-
(1) 缓存对象:
- 直接用
value
缓存整个对象的JSON; - 用
key = object.成员变量
和value
拆分对象内容进行缓存;
- 直接用
-
(2) 常规计数;
- 记录访问次数等;
-
(3) 共享Session信息;
- 让分布式系统中的所有服务器都去Redis中取用户的Session信息;
2. List
- 用于存放字符串数组;
- 列表的最大长度是
2^32-1
;
2.1 内部实现
-
在Redis3.2前:
- 元素个数少于
512
,且每个元素值小于64
字节,用压缩列表; - 否则,使用双向链表;
- 元素个数少于
-
在Redis3.2之后:
- 只使用快速列表;
下面介绍两种压缩列表和quicklist的数据结构;
-
(1) 压缩列表ziplist
- 使用连续内存空间保存链表数据;
- 只适合保存小规模数据;
- 因为每个节点都记录前一个节点的长度,所以会有连锁更新问题;
-
(2) 快速列表quicklist
- 是压缩列表和双向链表的混合体;
- 总体是双向链表,可以方便扩展元素;
- 每个链表节点都是一个压缩列表,进而可以节约空间;