Redis数据结构之map和set和sortedset
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、做标签 应⽤它的集合性质
redis八种数据结构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来查数据
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论