redis各数据结构解读

441 阅读2分钟

1、在介绍之前,先说明一点,字符串是redis最基础的数据结构,键都是字符串类型,所有下面讨论的数据结构是针对值value而言的。

字符串

缓存功能:setget
计数:incr
共享session
限速:set key value EX 60 NX + incr

哈希

类比关系型数据库等用法,根据具体场景使用

列表

消息队列:lpush+brpop
文章列表:分页、有序、按照索引范围获取
栈:lpush+lpop
队列:lpush+rpop

集合

标签:sadd
生成随机数:spop、srandmember
一些集合间操作

有序集合

排行榜系统:zadd

Bitmaps

网站的访问量

HyperLogLog

GEO

地理信息定位

stream

以上是常用的几种,之后再有典型的用法和场景,再做更新

2、如何自定义数据类型?

接下来,以开发一个叫做NewTypeObject的新数据类型为例进行说明:
1、定义新数据类型的底层结构
	用newtype.h保存,具体的结构如下
    struct NewTypeObject {
    	struct NewTypeNode *head;
        size_t len;
    }NewTypeObject;
    NewTypeNode是自定义的新类型的底层结构,具体如下
    struct NewTypeNode {
    	long value;保存实际数据
        struct NewTypeNode *next;指向下一个NewTypeNode的指针
    };
2、在RedisObject的type属性中,增加这个新类型的定义
	在Redis的server.h文件中,以下是所有的类型:
        #define OBJ_STRING 0    /* String object. */
        #define OBJ_LIST 1      /* List object. */
        #define OBJ_SET 2       /* Set object. */
        #define OBJ_ZSET 3      /* Sorted set object. */
        #define OBJ_HASH 4      /* Hash object. */
        #define OBJ_MODULE 5    /* Module object. */
        #define OBJ_STREAM 6    /* Stream object. */
    	#define OBJ_NEWTYPE 7   这是新增的
3、开发新类型的创建和释放函数
	Redis把数据类型的创建和释放函数都定义在了object.c文件中
    robj *createNewTypeObject(void){
    	NewTypeObject *h = newtypeNew();
        robj *o = createObject(OBJ_NEWTYPE,h);Redis提供的RedisObject创建函数
        return o;
    }
    以下函数在t_newtype.c文件中
    //用来为新数据类型初始化内存结构的
    NewTypeObject *newtypeNew(){
    	NewTypeObject *n = zmalloc(sizeof(*n));
        n->head = NULL;
        n->len = 0;
        return n;
    }
4、开发新类型的命令操作
	在t_newtype.c文件中增加命令操作的实现,比如
    void ntinsertCommand(client *c){
    	//todo
    }
    在server.h中,声明已经实现的命令,以便在server.c中引用这个命令
    void ntinsertCommand(client *c)
    在server.c中的redisCommandTable里面,把新增命令和实现函数关联起来
    struct redisCommand redisCommandTable[]{
    	...
        {"ntinsert",ntinsertCommand,2,"m",...}
    }
5、新数据类型的持久化

3、目前Redis中的数据结构的源码整理

t_hash.c
t_list.c
t_set.c
t_stream.c
t_string.c
t_zset.c
geo.h
geo.c
hyperloglog.c
bitops.c
底层编码相关:
adlist.h
adlist.c
dict.h
dict.c
intset.h
intset.c
quicklist.h
quicklist.c
sds.h
sds.c
ziplist.h
ziplist.c
stream.h
rax.h
rax.c
listpack.h
listpack.c