什么是Redis?

这个Redis,它是一个内存的,键值对的,单线程的。当然这里要注意一下,这里面说的单线程指得是工作线程是单个线程,在后续版本中它又出现了多线程,而这个多线程是IO多线程,我们一会儿再解释~

关于Redis的介绍和总结呢,我们可以先从一个模型来入手。

比如说,我有一个Redis,Redis它是一个C语言写的程序。在服务器里面有一个东西叫做内核(kernel),然后可以有很多客户端并发的去访问Redis。

当redis和多个并发的客户端在通信的时候,可能有的客户端发了数据,有的客户端没发数据。那么,如何达到最快速的知道谁有数据我就读谁,谁没数据,我就不碰它,减少没必要的操作,这样的话呢,它的底层则是用了epoll。

当然,说epoll也不是太准确,因为如果内核没有epoll的话,它会降低成select或者poll。说白了,这几个东西都归属为多路复用器。

通过多路复用器来获得IO事件。有了事件之后,我们就需要自己去调代码,程序自己要去读写IO所以这叫做同步模型。

然后读过来的数据被放到内存中就会开始根据解析读到的东西进行计算。

在IO读取的时候,即便通过事件已经知道哪些可以读了,但因为Redis是单线程的所以底层需要遍历。因此读取是串行的。

读出来以后进行计算,也是要先计算好第一个,才能计算第二个,所以,计算也是串行的。

redis提供五种数据类型:string,hash,list,set及zset(sorted set)。

String(字符串):

 

Redis 字符串是字节序列。Redis 字符串是二进制安全的,这意味着他们有一个已知的长 度没有任何特殊字符终止,所以你可以存储任何东西,512 兆为上限

typedef char* sds;
struct sdshdr{
longlen;
longfree;
charbuf[];
};

redis采用结构sdshdr和sds封装了字符串,字符串相关的操作实现在源文件sds.h/sds.c中。

List(双向链表)

 

Redis的链表是简单的字符串列表,排序插入顺序。您可以添加元素到 Redis 的列表的 头部或尾部

typedef struct listIter{
listNode * next;
intdirection;
}listIter;typedef struct list{
listNode * head;
listNode* tail;
void* (*dup)(void* ptr);
void(*free)(void* ptr);
int(*match)(void* ptr,void* key);
unsignedintlen;
listIteriter;
}list;
list的定义和实现在源文件adlist.h/adlist.c

dict(hash表)

Redis 的哈希是键值对的集合。Redis 的哈希值是字符串字段和字符串值之间的映射, 因此它们被用来表示对象

#include<stdio.h>

typedef struct dictEntry{
void* key;
void* val;
struct dictEntry* next;
}dictEntry;typedef struct dictType{
unsigned int(*hashFunction)(constvoid * key);
void* (*keyDup)(void* privdata,constvoid* key);
void* (*valDup)(void* privdata,constvoid* obj);
int(*keyCompare)(void* privdata,constvoid* key1,constvoid* key2);
void(*keyDestructor)(void* privdata,void* key);
void(*valDestructor)(void* privdata,void* obj);
}dictType;

typedef struct dict{
dictEntry * *table;
dictType* type;
unsignedlongsize;
unsignedlongsizemask;
unsignedlongused;
void* privdata;
}dict;

typedef struct dictIterator{
dict * ht;
intindex;
dictEntry* entry,* nextEntry;
}dictIterator;

 

在源文件dict.h/dict.c中实现了hashtable的操作

zset(排序set)

 

Redis 的有序集合类似于 Redis 的集合,字符串不重复的集合。

 
typedef struct zskiplistNode{
  struct zskiplistNode * *forward;
  struct zskiplistNode* backward;
  double score;
  robj* obj;
}zskiplistNode;
typedef struct zskiplist{
  struct zskiplistNode * header,*tail;
  unsigned long length;
  int level;
}zskiplist;
typedef struct zset{
  dict * dict;
  zskiplist* zsl;
}zset;

 

分类: Redis

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

蜀ICP备16001794号
© 2014 - 2024 linpxing.cn All right reserved.