IT小栈

  • 主页
  • Java基础
  • RocketMQ
  • Kafka
  • Redis
  • Shiro
  • Spring
  • Spring Boot
  • Spring Cloud
  • 资料链接
  • 关于
所有文章 友链

IT小栈

  • 主页
  • Java基础
  • RocketMQ
  • Kafka
  • Redis
  • Shiro
  • Spring
  • Spring Boot
  • Spring Cloud
  • 资料链接
  • 关于

Redis整体数据存储说明

2020-04-30

很多时候我们总是有些疑问我们经常提到的redis五种基本类型是如何存储的,redis是如何管理key的,本节我们讨论下redis的数据库存储。

1、数据库

Redis服务器将所有数据库都保存在server.h/redisServer结构的db数组中,db数组的每一项都是一个server.h/redisDb结构,每个redisDb结构代表一个数据库。

1
2
3
4
5
6
7
8
struct redisServer {
// ...
//数组,保存着服务器中的所有的数据库
redisDb *db;
//服务器的数据库数量,默认情况下是16
int dbnum; /* Total number of configured DBs */
// ...
}

Redis服务器默认会创建16个数据库

Redis是一个键值对数据库服务器,每个数据库都由一个server.h/redisDb结构,其中redisDb结构的dict字典中保存数据库中的所有的键值对。

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct redisDb {
//数据库的键空间,保存数据库中的所有的键值对
dict *dict; /* The keyspace for this DB */
//过期字典,保存着键的过期时间
dict *expires; /* Timeout of keys with a timeout set */
dict *blocking_keys; /* Keys with clients waiting for data (BLPOP)*/
dict *ready_keys; /* Blocked keys that received a PUSH */
dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */
int id; /* Database ID */
long long avg_ttl; /* Average TTL, just for stats */
unsigned long expires_cursor; /* Cursor of the active expire cycle. */
list *defrag_later; /* List of key names to attempt to defrag one by one, gradually. */
} redisDb;

键空间的键也是数据库的键,每一个键都是一个字符串对象。

键空间的值也是数据库的值,每一个值可以是字符串对象、列表对象、哈希对象、集合对象等等。

那我们知道了dict中存储了当前数据库的所有的键值对,那么我们具体看下dict的数据结构

dict我们会在后面的章节中重点介绍,我们本节重点就是分析键值的存储。

dict->dictht->dictEntry 这个才是真正存储键值的实体,

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct dictEntry {
// 键
void *key;
// 值
union {
void *val;
uint64_t u64;
int64_t s64;
} v;
// 指向下个哈希表节点,形成链表
struct dictEntry *next;
} dictEntry;

我们看到key和val都是一个指针,就是我们经常说的redis的基础类型,字符串、字典、链表等等都是redisObject

1
2
3
4
5
6
7
8
9
typedef struct redisObject {
//类型
unsigned type:4;
//编码
unsigned encoding:4;
//指向底层实现数据结构的指针
void *ptr;
//....
} robj;
属性 说明
type 常量,记录对象的类型如:REDIS_STRING(字符串)、REDIS_LIST(列表)、REDIS_HASH(哈希)、REDIS_SET(集合)、REDIS_ZSET(有序集合);对于Redis数据库保存的键值对来说,键一定是字符串对象,值字符串、列表、哈希等其他类型
encoding 常量,记录底层真正的实现的数据结构,如:REDIS_ENCODING_EMBSTR(embstr编码的简单动态字符串)、REDIS_ENCODING_RAW(简单动态字符串)、REDIA_ENCODING_ZIPLIST(压缩列表)、REDIS_ENCODING_LINKEDLIST(双端链表)等;REDIS_ENCODING_EMBSTR和REDIS_ENCODING_RAW这两个都表示字符串
ptr 指向底层实现数据结构的指针

每一种类型(type)的对象都至少使用了两种不同的编码。

我们可以通过object encoding命令查看数据库键的值对象的编码。

同样是设置的字符串但是发现底层编码不一致,后面章节我们会具体分析在不同的情况下使用的底层结构也不一样。

下面就是完整的数据存储到Redis中的存储结构:

2、键的过期

数据库中的键也可以设置过期时间,因为这个也是和数据库的底层设计有关,我们一起讲解

我们在上面介绍过redisDb结构中有一个expires字典保存了键的过期时间,该字典保存了当前数据库的所有的过期的键的值。

本文作者: 顾 明 训
本文链接: https://www.itzones.cn/2020/04/30/Redis整体数据存储说明/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
  • redisDb
  • redisServer
  • redis

扫一扫,分享到微信

微信分享二维码
Redis基本数据类型之String
Redis简单介绍
  1. 1. 1、数据库
  2. 2. 2、键的过期
© 2020 IT小栈
载入天数...载入时分秒... || 本站总访问量次 || 本站访客数人次
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链

tag:

  • jvm
  • Java基础
  • kafka HW
  • kafka Leader Epoch
  • kafka
  • kafka位移主题
  • kafka位移提交
  • kafka副本机制
  • kafka ISR
  • zookeeper
  • kafka消息丢失
  • kafka日志存储
  • kafka Log Clean
  • kafka Log Compaction
  • kafka消费位移设置
  • kafka Rebalance
  • kafka分区算法
  • kafka生产者拦截器
  • kafka SASL/SCRAM
  • kafka ACL
  • redis
  • redis Ziplist
  • redis Hashtable
  • redis LinkedList
  • redis QuickList
  • redis intset
  • redis String
  • redis SDS
  • redis SkipList
  • redisDb
  • redisServer
  • redis 简介
  • Redis Cluster
  • 主从同步
  • RocketMQ高可用HA
  • 事务消息
  • 内存映射
  • MMAP
  • 同步刷盘
  • 异步刷盘
  • 消息存储文件
  • RocketMQ安装
  • 延迟消息
  • RocketMQ入门
  • 推拉模式
  • PushConsumer
  • 消费结果处理
  • rebalance
  • RocketMQ权限控制
  • RocketMQ ACL
  • 消息过滤
  • 消息重试
  • 消费位置
  • 集群消费
  • 广播消费
  • 运维命令
  • shiro源码分析
  • shiro入门
  • IOC和DI
  • Spring创建Bean
  • Bean生命周期
  • Sping属性注入
  • 异常
  • SpringMVC
  • springCloud
  • Eureka

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 我的OSCHINA
  • 我的CSDN
  • 我的GITHUB
  • 一生太水