1、在介绍之前,先说明一点,字符串是redis最基础的数据结构,键都是字符串类型,所有下面讨论的数据结构是针对值value而言的。
字符串
缓存功能:set、get
计数: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