IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 三、Redis数据库存储结构及过期策略 -> 正文阅读

[大数据]三、Redis数据库存储结构及过期策略

Redis数据库结构

源码:server.h
在server.h里有个redisServer 结构,它的属性db数组,存储数据库信息

struct redisServer {
	...
    redisDb *db; //db数组
	int dbnum;  //db数量,默认是16,可以修改配置
	...
};

切换数据库:

127.0.0.1:6379> set msg hello
OK
127.0.0.1:6379> get msg
"hello"
127.0.0.1:6379[2]> select 1
OK
127.0.0.1:6379[1]> get msg
(nil)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get msg
"hello"

每个client都一个db属性指向redisDb。

结构图:

在这里插入图片描述

redisDb属性:

typedef struct redisDb {
    dict *dict;    //数据库的键空间            
    dict *expires;   //过期时间字典          
    dict *blocking_keys;       
    dict *ready_keys;          
    dict *watched_keys;        
    int id;                    
    long long avg_ttl;         
    unsigned long expires_cursor; 
    list *defrag_later;        
    clusterSlotToKeyMapping *slots_to_keys;
} redisDb;

dict字典保存数据库的所有键值对,叫做键空间。key是数据库的键,是字符串对象,键空间的值也是数据库中键的值对象(可以是列表,哈希表等)。

结构图:

在这里插入图片描述

对键的增删改查都是操作的键空间。

查询的时候发现键过期了,会先删除。watch了摸个键,键被修改的时候会标记为脏(dirty)。

设置过期键和查看过期事件:


127.0.0.1:6379> ttl msg
(integer) -1
127.0.0.1:6379> expire msg 5
(integer) 1
127.0.0.1:6379> ttl msg
(integer) 3
127.0.0.1:6379> ttl msg
(integer) -2
127.0.0.1:6379> get msg
(nil)

expire命令:

redisDb 的expires字典保存键的过期时间。

过期键删除策略:
我们知道过期键的过期时间都保存在过期字典中,那么什么时候删除?
1、定时删除 创建一个定时器,过期就删除
2、惰性删除 过期了不管,再次查询时,检测到过期,再去删除
3、定期删除 每隔一段时间,对数据库进行一次扫描,删除过期的。

db.c的expireIfNeeded函数实现惰性删除。

执行save或bgsave时,会对键进行过期检查,如果过期,就不会保存到rdb中。

载入rdb时,如果是主服务器,也会对键进行过期检查。要是从服务器,不会对过期键进行检查,但是主从同步会清空从数据库的数据。

如果是aof模式,在写入时不会对过期键进行检查,而是等过期后,追加一个DEL命令。载入时会对键进行过期检查。

复制时,主服务器删除一个过期键时,会显示发送给从服务器一个DEL,从服务在遇到过期键时,也不会删除,直到遇到DEL命令才删除。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:37:17  更:2022-07-21 21:38:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 22:26:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码