0
点赞
收藏
分享

微信扫一扫

Redis基本数据类型,源码解析

你的益达233 2022-02-15 阅读 65

redis常用基本数据类型:String、Hash、List 、Set、ZSet

redis不常用数据类型:、Hyperloglog、Geo、Streams

1.String 字符类型

可以用来存储字符串、整数、浮点数

数据结构如下: dictEntry 、redisObject

typedef struct dictEntry {

void * key ; /* key 关键字定义 */

union {

void * val ;

uint64_t u64 ; /* value 定义 */

int64_t s64 ;

double d ;

} v ;

struct dictEntry * next ; /* 指向下一个键值对节点 */

} dictEntry

typedef struct redisObject {

unsigned type : 4 ; /* 对象的类型,包括: OBJ_STRING OBJ_LIST OBJ_HASH OBJ_SET OBJ_ZSET */

unsigned encoding : 4 ; /* 具体的数据结构 */

unsigned lru : LRU_BITS ; /* 24 位,对象最后一次被命令程序访问的时间,与内存回收有关 */

int refcount ; /* 引用计数。当 refcount 0 的时候,表示该对象已经不被任何对象引用,则可以进行垃圾回收了

*/

void * ptr ; /* 指向对象实际的数据结构 */

} robj ;

底层字符串存储类型是redis自定义的数据类型:

1.int 8个字节长度  2^63-1

2. embstr 存储小于44字节的字符串(SDS字符串)

3.raw存储大于44字节的字符串 (3.2版本之前是 39)

应用场景:

1)缓存:热点数据缓存(例如报表,明星出轨),对象缓存,全页缓存

2)分布式服务数据共享

3)分布式锁

4)全局ID

5) 计数器 incr 

6)限流 incr

7)位统计

2.Hash哈希类型

typedef struct dictEntry {

void * key ; /* key 关键字定义 */

union {

void * val ;

uint64_t u64 ; /* value 定义 */

int64_t s64 ;

double d ;

} v ;

struct dictEntry * next ; /* 指向下一个键值对节点 */

} dictEntry ;

typedef struct dictht {

dictEntry ** table ; /* 哈希表数组 */

unsigned long size ; /* 哈希表大小 */

unsigned long sizemask ; /* 掩码大小,用于计算索引值。总是等于 size-1 */

unsigned long used ; /* 已有节点数 */

} dictht ;

typedef struct dict {

dictType * type ; /*

字典类型

*/

void * privdata ; /*

私有数据

*/

dictht ht [ 2 ]; /* 一个字典有两个哈希表 */

long rehashidx ; /* rehash 索引 */

unsigned long iterators ; /* 当前正在使用的迭代器数量 */

} dict ;

dictEntry——>dictht——>dict

3.List类型

quicklist(快速列表)是 ziplist 和 linkedlist 的结合体

typedef struct quicklist { 

quicklistNode *head; /* 指向双向列表的表头 */ 
quicklistNode *tail; /* 指向双向列表的表尾 */ 
unsigned long count; /* 所有的 ziplist 中一共存了多少个元素 */ 
unsigned long len; /* 双向链表的长度,node 的数量 */ 
int fill : 16; /* fill factor for individual nodes */ 
unsigned int compress : 16; /* 压缩深度,0:不压缩; */ 
} quicklist;

4.Set类型(无序)

使用hashtable  使用hash类型的key

5.ZSet类型(有序)

ziplist skiplist 实现

typedef struct zskiplistNode {

sds ele ; /* zset 的元素

*/

double score ; /* 分值

*/

struct zskiplistNode * backward ; /* 后退指针 */

struct zskiplistLevel {

struct zskiplistNode * forward ; /* 前进指针,对应 level 的下一个节点 */

unsigned long span ; /* 从当前节点到下一个节点的跨度(跨越的节点数) */

} level []; /* */

} zskiplistNode ;

typedef struct zskiplist {

struct zskiplistNode * header , * tail ; /* 指向跳跃表的头结点和尾节点 */

unsigned long length ; /*

跳跃表的节点数 */

int level ; /* 最大的层数

*/

} zskiplist ;

typedef struct zset { 咕泡出品,必属精品 www.gupaoedu.com

41

dict * dict ;

zskiplist * zsl ;

} zset ;

举报

相关推荐

0 条评论