Redis在实现键值对数据库时,并没有直接使用数据结构,而是基于已有的数据结构创建了一个对象系统,每种对象至少包含一种数据结构。

redis3.0 中对象结构:

typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
int refcount;
void *ptr;
} robj;

这个系统包含字符串对象,列表对象,哈希对象,集合对象和有序集合对象5中类型的对象。

使用对象有什么好处?

1:根据对象的类型来判断一个对象是否可以执行给定的命令。

2:针对不同的数据场景,为对象设置多种不同的数据结构实现,从而优化在不同场景的使用效率。

3:对象系统还实现了基于应用计数的内存回收机制

4:Redis的对象带有访问时间记录的信息,如果该键的空转时长较大那么会优先删除掉

对象中的 type 类型:

/* Object types */
#define REDIS_STRING 0 /*字符串对象*/
#define REDIS_LIST 1 /*列表对象*/
#define REDIS_SET 2 /*集合对象*/
#define REDIS_ZSET 3 /*有序集合对象*/
#define REDIS_HASH 4 /*哈希对象*/

可以用 type 命令查看对象的类型

encoding 编码:

#define REDIS_ENCODING_RAW 0     /* Raw representation 简单动态字符串*/
#define REDIS_ENCODING_INT 1 /* Encoded as integer long 类型的整数*/
#define REDIS_ENCODING_HT 2 /* Encoded as hash table 字典*/
#define REDIS_ENCODING_ZIPMAP 3 /* Encoded as zipmap 压缩map*/
#define REDIS_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list 双端链表*/
#define REDIS_ENCODING_ZIPLIST 5 /* Encoded as ziplist 压缩列表*/
#define REDIS_ENCODING_INTSET 6 /* Encoded as intset 整数集合*/
#define REDIS_ENCODING_SKIPLIST 7 /* Encoded as skiplist 跳跃表*/
#define REDIS_ENCODING_EMBSTR 8 /* Embedded sds string encoding embstr编码的简单动态字符串*/

raw 编码 和 embstr编码的区别:

1:如果字符串对象保存都是一个字符串值,并且这个字符串值长度小于等于32字节,那么使用embstr编码方式保存值,也就是说 embstr是用来保存短字符串的值

这样做有什么好处呢?

1:raw编码会调用2次内存分配函数分别创建redisObject结构和sdshdr结构, 而embstr编码则通过调用 1 次内存分配函数分配一块连续的空间,空间会包含redisObject和sdshdr结构。

2:那么释放的时候raw要释放2次, 而embstr只释放一次内存空间。

refcount 属性:

Redis为对象系统构建了一个引用计数,就是这个字段,目的是来实现内存回收机制。

ptr 属性:

存储的值

lru 属性:

这个属性记录了对象最后一次呗命令程序访问的时间

我们可以用这个属性来计算给定键多长时间没有被访问了。

命令: object idletime 健名

还有一个用处:

如果服务器设置打开了maxmemory选项,并且服务器回收内存算法为volatile-lru或者allkeys-lru,那么当服务器的内存超过了maxmemory设置的上限时,没有被访问的时间越长的键就越有限被服务器释放,从而回收内存

redis源码解析(1):redisObject对象说明的更多相关文章

  1. Redis源码解析:08对象

    前面介绍了Redis用到的所有主要数据结构,比如简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合等.然而Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一 ...

  2. .Net Core缓存组件(Redis)源码解析

    上一篇文章已经介绍了MemoryCache,MemoryCache存储的数据类型是Object,也说了Redis支持五中数据类型的存储,但是微软的Redis缓存组件只实现了Hash类型的存储.在分析源 ...

  3. Redis源码解析:15Resis主从复制之从节点流程

    Redis的主从复制功能,可以实现Redis实例的高可用,避免单个Redis 服务器的单点故障,并且可以实现负载均衡. 一:主从复制过程 Redis的复制功能分为同步(sync)和命令传播(comma ...

  4. AspNetCore3.1_Secutiry源码解析_2_Authentication_核心对象

    系列文章目录 AspNetCore3.1_Secutiry源码解析_1_目录 AspNetCore3.1_Secutiry源码解析_2_Authentication_核心项目 AspNetCore3. ...

  5. Redis源码解析之跳跃表(三)

    我们再来学习如何从跳跃表中查询数据,跳跃表本质上是一个链表,但它允许我们像数组一样定位某个索引区间内的节点,并且与数组不同的是,跳跃表允许我们将头节点L0层的前驱节点(即跳跃表分值最小的节点)zsl- ...

  6. Redis源码解析:13Redis中的事件驱动机制

    Redis中,处理网络IO时,采用的是事件驱动机制.但它没有使用libevent或者libev这样的库,而是自己实现了一个非常简单明了的事件驱动库ae_event,主要代码仅仅400行左右. 没有选择 ...

  7. Redis源码解析:26集群(二)键的分配与迁移

    Redis集群通过分片的方式来保存数据库中的键值对:一个集群中,每个键都通过哈希函数映射到一个槽位,整个集群共分16384个槽位,集群中每个主节点负责其中的一部分槽位. 当数据库中的16384个槽位都 ...

  8. Mybatis源码解析 - mapper代理对象的生成,你有想过吗

    前言 开心一刻 本人幼教老师,冬天戴帽子进教室,被小朋友看到,这时候,有个小家伙对我说:老师你的帽子太丑,赶紧摘了吧.我逗他:那你好好学习,以后给老师买个漂亮的?这孩子想都没想立刻回答:等我赚钱了,带 ...

  9. Redis源码解析

    一.src/server.c 中的redisCommandTable列出的所有redis支持的命令,其中字符串命令包括从get到mget:列表命令从rpush到rpoplpush:集合命令包括从sad ...

  10. Redis源码解析:25集群(一)握手、心跳消息以及下线检测

    Redis集群是Redis提供的分布式数据库方案,通过分片来进行数据共享,并提供复制和故障转移功能. 一:初始化 1:数据结构 在源码中,通过server.cluster记录整个集群当前的状态,比如集 ...

随机推荐

  1. Linux学习历程——Centos 7 top命令

    一.命令介绍 top 命令用于动态的监控进程活动与系统负载信息. 格式为 top [参数] 二.实例 直接运行top命令 top命令执行结果的前五行为系统整体的统计信息,代表含义如下: 第1行:系统时 ...

  2. Linux Swap交换分区探讨

    Swap交换分区概念 Linux divides its physical RAM (random access memory) into chucks of memory called pages. ...

  3. Docker 镜像仓库

    仓库 仓库(Repository)是集中存放镜像的地方. 一个容易混淆的概念是注册服务器(Registry).实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜 ...

  4. 报错:[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop bei

    项目中遇到父组件传值 activeIndex <Tabs :tabs="tabs" :activeIndex="activeIndex" >< ...

  5. 位(Bit)与字节(Byte)

    字 word 字节 byte 位 bit 字长是指字的长度 1字=2字节(1 word = 2 byte) 1字节=8位(1 byte = 8bit) 一个字的字长为16 一个字节的字长是8 bps ...

  6. 正则表达式regex(golang版)

    代码: //File: main.go package main import ( "fmt" "regexp" ) func main() { r := re ...

  7. 【题解】P1171 售货员的难题

    Tags 搜索,状压​. 裸的旅行商问题 #include <stdio.h> #include <string.h> #define re register #define ...

  8. CodeChef Dynamic GCD

    嘟嘟嘟vjudge 我今天解决了一个历史遗留问题! 题意:给一棵树,写一个东西,支持一下两种操作: 1.\(x\)到\(y\)的路径上的每一个点的权值加\(d\). 2.求\(x\)到\(y\)路径上 ...

  9. 18 python 初学(time、random 模块)

    # _author: lily # _date: 2019/1/13 import time import datetime print(help(time)) # print(time.time() ...

  10. copy 和 deepcopy的区别

    import copy a = [1, 2, 3, 4, ['a', 'b']] b = a # 引用,除非直接给a重新赋值,否则a变则b变,b变则a变 c = copy.copy(a) # 浅复制, ...