Redis介绍与使用

redis概述
redis是一种非关系型数据库,部署在内从中的键值数据库,其value可以有五种类型,分别为string,set,hash,list,zset
STRING:可以存储字符串,整数或者浮点数,可以对于整个字符串或者字符串中的字串进行操作,当其为整数或者浮点数时,可以进行自增或者自减操作

LIST:主要存储列表。两端压入或弹出,可以对于多个元素进行修剪,只保留一个范围内的元素

SET :可以添加获取移除单个元素,计算交,并,差集,从集合中随机获取元素

HASH:可以添加获取移除单个元素,检查元素是否存在,获取所有键值对

ZSET:添加获取删除元素,根据分值范围或成员来获取元素,计算一个键的排名
数据结构底层实现
string:
struct sdshdr{
int len;//已经占用空间长度
int free;//剩余空间长度
char buf[];//数据空间
}
相比于直接调用c字符串的优势是可以直接保存长度无需遍历。除此之外还可以减少缓冲区溢出的问题,因为使用前会先检查剩余长度是否足够。

list:
双向链表,不过多介绍

typedef struct listNode{

struct listNode *prev;

struct listNode * next;

void * value;

}

hash:

typedef struct dictht {

//哈希表数组

dictEntry **table;

//哈希表大小

unsigned long size;

//哈希表大小掩码,用于计算索引值

unsigned long sizemask;

//该哈希表已有节点的数量

unsigned long used;

}
typeof struct dictEntry{

//键

void *key;

//值
//不同的键值对应的值可能不同类型,
//因此使用union来解决这个问题
union{

void *val;

uint64_tu64;

int64_ts64;

}

struct dictEntry *next;

}

当hash冲突时,采用拉链法解决冲突
zset:
底层采用跳表实现,可以用来代替二叉平衡树

跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速查找访问节点的目的。跳跃表是一种随机化的数据,跳跃表以有序的方式在层次化的链表中保存元素,效率和平衡树媲美 ——查找、删除、添加等操作都可以在O(logn)期望时间下完成。
Redis介绍与使用_第1张图片

//节点的具体实现
typedef struct zskiplistNode{

//层

struct zskiplistLevel{

//前进指针

struct zskiplistNode *forward;

//跨度

unsigned int span;

} level[];

//后退指针

struct zskiplistNode *backward;

//分值

double score;

//成员对象

robj *obj;

}
typedef struct zskiplist {

//表头节点和表尾节点

structz skiplistNode *header,*tail;

//表中节点数量

unsigned long length;

//表中层数最大的节点的层数

int level;

}zskiplist;

还不了解的小伙伴可以看下面这篇帖子
Skip List–跳表(全网最详细的跳表文章没有之一)
set:

typedef struct intset{

//编码方式int16_t、int32_t、int64_t

uint32_t enconding;

// 集合包含的元素数量

uint32_t length;

//保存元素的数组

int8_t contents[];

}

intset是Redis内存数据结构之一,和之前的 sds、 skiplist、dict、adlist
等通用数据相比,它是Redis特有的,用来实现Redis的Set结构(当元素较小且为数字类型时),它的特点有:

元素类型只能为数字。 元素有三种类型:int16_t、int32_t、int64_t。 元素有序,不可重复。
intset和sds一样,内存连续,就像数组一样。

你可能感兴趣的:(redis,数据结构,哈希算法)