Redis是基于内存亦可持久化的日志型、Key-Value数据库。
Redis的使用场景
数据结构:
底层结构
struct SDS<T> {
T capacity; // 数组容量
T len; // 数组长度
byte flags; // 特殊标识位,不理睬它
byte[] content; // 数组内容
}
typedef struct listNode {
struct listNode *prev;//前置节点
struct listNode *next;//后置节点
void *value;//节点的值
} listNode;
typedef struct list {
//表头节点
listNode *head;
//表尾节点
listNode *tail;
//节点值复制函数void *(*dup)(void *ptr);
//节点值释放制函数void (*free)(void *ptr);
//节点值对比函数int (*match)(void *ptr, void *key);
//链表所包含的节点数量
unsigned long len;
} list;
# 字典
typedef struct dict{
//类型特定函数
dictType *type;
//私有数据
void *privdata;
//哈希表
dictht ht[2];
//rehash索引
//当rehash不在进行时,值为-1
int rehashidx;
}dict;
# 哈希表
typedef struct dictht{
//哈希表数组
dictEntry **table;
//哈希表大小
unsigned long size;
//哈希表大小掩码,用于计算索引值
//总是等于 size-1
unsigned long sizemask;
//该哈希表已有节点的数量
unsigned long used;
}dictht;
# 哈希表节点
typedef struct dictEntry{
//键
void *key;
//值
union{
void *val;
uint64_tu64;
int64_ts64;
}v;
//指向下一个哈希表节点,形成链表
struct dictEntry *next;
}dictEntry;
# 跳跃表节点
typedef struct zskiplistNode {
//成员对象
robj *obj;
//分值
double score;
//后退指针
struct zskiplistNode *backward;
//层—每个层元素都包含一个指向其他节点的指针,可以通过指针快速访问其他节点
struct zskiplistLevel {
struct zskiplistNode *forward;//前进指针
unsigned int span;//跨度
} level[];
} zskiplistNode;
# 跳跃表:zskiplist 持有 跳跃表节点,可以更方便的对整个跳跃表进行处理,表头、表尾
typedef struct zskiplist {
//表头节点和表尾节点
struct zskiplistNode *header, *tail;
//表中节点的的数量
unsigned long length;
//表中层数最大的节点层数int level;
} zskiplist;
typedef struct intset {
// 编码方式
uint32_t encoding;
// 集合包含的元素数量
uint32_t length;
// 保存元素的数组
int8_t contents[];
} intset;
分布式锁:
Redis的单线程
Redis的持久化
Redis管道
Redis事务
Redis集群
Redis监控
实战问题
1、《Redis深度历险》
2、https://www.cnblogs.com/enochzzg/p/11294773.html
3、https://www.cnblogs.com/wanglijun/p/8797069.html
4、《Redis 设计与实现》