map的结构是典型的字典结构
他的命令是H开头的一些命令 hset 、hget 、hexists (用来判断是否存在某个字段 返回值是1 说明存在)
用途:
可以用来存储类似对象的数据
一定要注意value不能 嵌套其他类型了
map的数据结构
在dict.h 这个文件里
有两种:
1)hash
2)ziplist 数据量小的时候用这个
map源码解读
在src目录下的dict.h这个文件里
map的定义是这段代码
typedef struct dictEntry{
void *key; //这个是key
union{ //这个用来存储value
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
struct dictEntry *next; //用来存储相邻元素的指针 去维护hash桶的内部链 作用是在处理hash碰撞的时候通过链表的方式来实现
} dictEntry;
typedef stuct dictht{ //作用是通过bucket去存放dictEntry地址 可以认为他是一个bucket 通过hash算法来计算key应该放在哪个bucket里面
dictEntry **table;
unsigned long size;
unsigned long sizemask;
unsigned long used;
} dictht;
hash 扩容时会做rehash操作
typedef struct dict{ //它是rehash的核心
dictType *type;
void *private;
dictht ht [2];
long rehashidx; //当前key rehash到bucket的标志
int iterators;
} dict
应用场景是
用来存放对象信息 因为他是一个二维表结构
set类型数据
数据结构
有两种:
intset 当数据中仅包含整数类型的时候 用intset来保存这个集合
hashtable 当数据中的类型不一致时
它使用key来存储值 value设为空即null
set中的数据是不重复的
set的源码太简单了 我都不屑于再码一般 此处略过
应用场景
1、做标签 应用它的集合性质
2、去重 应用它的key是不能重复的这个性质
3、共同好友 可以用来计算常规的集合操作 交集 并集等
sortedset 有序集合
sortedset和set都是集合 区别是sortedset 多了一个score的概念,这是sortedset有序的实现
sortedset的数据结构
数据结构的话有两种
ziplist
skiplist+hashtble
我试着把skiplist讲清楚
首先这是一个有序的链表
当我们向集合里添加数据的时候先去做一个算法 ,简单理解就是这是一个随机算法;作用是:获取插入数据的层数
第一步:比如添加的数据a比如是14,比如经过算法计算得到的level-a=1;那就意味着这个20 存放的位置是第1层
第二步:再添加一个数据b比如是19 这里会做一个比较 19和14进行比较 a<b 所以会把b插入到a的后面 反之亦然,同时 用算法获取与b想对应的level-b进行保存;
第三步:再插入一个数据c 比如是8 首先会从level最高的那个数据获取值进行比较依次向下,找到正确的位置 并获取level进行存储;
level的没一层是有连接的 , 组成了链表 。 这是一个变种的二分法, 随着层数的增加, 数据会越来越少
这个链表的开始端是header 末尾端是null
查询数据时通过level来查找数据