Redis学习笔记(七) 数据库[通俗易懂]

Redis学习笔记(七) 数据库[通俗易懂]Redis 服务器将所有的数据库都保存在服务器状态redisServer结构的db数组中,db数组的每个项都是一个redisDB: struct redisServer{ //一个数组保存着服务器中的

Redis学习笔记(七) 数据库

Redis 服务器将所有的数据库都保存在服务器状态redisServer结构的db数组中,db数组的每个项都是一个redisDB:

struct redisServer{
  //一个数组保存着服务器中的所有数据库
  redisDb *db;
  //数据库的个数
  int dbnum;
}

代码100分

dbnum:服务器初始化时,程序根据dbnum 来决定应创建多少少数据库,由服务器配置的database选项决定,默认16.

在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前目标数据库,这个属性指向redisDb结构的指针:

代码100分typedef struct redisClient{
  //记录客户端当前正在使用的数据库
  redisDb *db;
} redisClient;

redisClient指针指向redisServer 数组的其中一个元素,而被指向的元素就是客户端的目标数据库。

Redis学习笔记(七) 数据库[通俗易懂]

 

 

 

 

redisBd结构的dict地点保存了数据库中的所有键值对,我们将这个字典称为键空间。

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

键空间的值也是数据库的值,每个值可以是字符串对象、列表对象、哈希表对象、集合对象和有序集合对象中的任意一种Redis对象。

 

Redis命令对数据库进行读写时,服务器不仅对键执行指定的读写操作,还会执行一些额外的维护工作:

1、读取一个键后,服务器会根据键是否存在来更新服务器键空间命中次数或键空间不命中次数。

2、读取一个键之后,服务器会更新键的LRU(最后一次使用时间),这个值用于计算键的空闲时间。

3、如果服务器在读取一个键时发现该键已经过期,那么服务器会先删除这个过期键,然后再执行余下的操作。

4、如果客户端使用Watch命令监视某个键,那么服务器再对被监视的键进行修改后,会将这个键标记为脏,从而让事务程序注意到这个键已经被修改过。

5、服务器每次修改一个键之后,都会对脏键计数器的值加一,这个计数器会触发服务器的持久化以及赋值操作。

6、如果服务器开启了数据库通知功能,那么在对键进行修改后,服务器将按配置发送相应的数据库通知。

 

设置过期时间

命令 EXPIRE key ttl 设置键生存时间为ttl秒

命令 PEXPIRE  key ttl 设置键生存时间为ttl毫秒

命令EXPIREAT key timestamp 命令 设置键key过期时间为timestamp秒数时间戳

命令 PEXPIREAT key timestamp 设置键key过期时间为timestamp所指定的毫秒时间戳

1、EXPIRE命令可以转换为 PEXPIRE命令

def EXPIRE(key,ttl_in_sec);
ttl_in_ms = sec_to_ms(ttl_in_sec)
PEXPIRE(key,ttl_in_ms)

2、PEXPIRE命令转换为PEXPIREAT命令

代码100分def PEXPIRE(key,ttl_in_ms)
now_ms = get_current_unix_timestamp_in_ms();
PEXPIREAT(key,now_ms+ttl_in_ms)

3、EXPIREAT命令转换为PEXPIREAT命令

def EXPIREAT(key,expire_time_in_asc)
expire_time_in_ms = sec_to_ms(expire_time_in_sec)
PEXPIREAT(key,expire_time_in_ms)

redisDB 结构的expires字典保存了数据库所在键的过期时间(过期字典),

1、过期字典的键是一个指针指向键空间的某个键对象。

2、过期字典的值是一个long类型的整数(毫秒精度的UNIX时间戳)。

 

过期删除策略

1、定时删除,在设置过期时间的同时,创建定时器,到期立即删除(内存友好,CPU不友好)。

2、惰性删除,下一次查询时,查询是否过期,过期删除,(内存不友好,CPU友好)。

3、定期删除,每隔一段时间执行一次。

Redis的删除策略使用了 惰性删除和定期删除两种。

 

在执行SAVE或者BGSAVE命令生成RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中,因此数据库包含过期键不会对新生成的RDB文件造成影响。

 

在载入RDB文件时,如果服务器以主服务器模式运行,载入RDB文件时会对键进行检查,未过期的键加载到数据库中,过期键忽略。从服务器模式运行时,文件中保存的所有键被加载,主从同步时,从服务器过期键被清空。

 

AOF文件写入时,如果过期键未清理,AOF文件不会因为过期键而产生影响,过期键被删除后,程序会向AOF文件追加DEL命令,来显示的记录该键已被删除。

 

AOF重写时,程序会对数据库中的键检查,已过期的键不会被保存到重写后的AOF文件中。

 

服务器在复制模式下,服务器的过期键由主服务器控制:主服务器在删除过期键后会向从服务器发送一条DEL命令,从服务在未收到命令前,客户端的读命令会像对未过期键处理方式一样,直到接到DEL命令,从过期键才会删除。

 


每天学一点,总会有收获。

 

说明:尊重作者知识产权,文中内容参考《Redis设计与实现》,仅在此做学习与大家分享。

Redis学习笔记(七) 数据库[通俗易懂]

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8427.html

(0)
上一篇 2023-02-28
下一篇 2023-02-28

相关推荐

  • 自然语言处理:让Python更智能的能力

    自然语言处理:让Python更智能的能力自然语言处理(Natural Language Processing,简称NLP)是计算机科学、人工智能和语言学等学科交叉的一门技术。它致力于使计算机能够理解、分析、处理人类语言。在这一过程中,Python已经成为了一种不可或缺的编程语言。Python的简洁性和功能强大的库,如nltk、spaCy和gensim等,使其成为了处理自然语言的首选语言。以下从选取语料、分词、词性标注、命名实体识别、情感分析等方面阐述NLP在Python中实现的方法和技巧。

    2024-02-24
    117
  • 查询代码在哪个视图、存储过程、函数、触发中使用过「建议收藏」

    查询代码在哪个视图、存储过程、函数、触发中使用过「建议收藏」工作中偶尔会出现:想用A数据表替换B数据表,然后把B数据表删除。但是,又不知道B数据表在哪个视图、存储过程、函数、触发器中使用过? 经过一番度娘,看到实现方法也不难,主要涉及两个系统表:sysobje

    2022-12-16
    133
  • MySQL数据库:group分组

    MySQL数据库:group分组group by:分组 GroupBy语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行

    2022-12-21
    156
  • 关系型数据库与非关系型数据库「建议收藏」

    关系型数据库与非关系型数据库「建议收藏」关系型数据库: 1、定义: 创建在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据 2、关系模型常用概念: (1)关系:可以理解为一张二维表,每个关系都具有一个关系名,就是通

    2022-12-27
    149
  • Python循环语句:while,快速实现重复执行

    Python循环语句:while,快速实现重复执行Python中的循环语句有两种,分别是while和for,本文重点讲解while语句的使用方法。while语句的基本格式为:

    2023-12-25
    101
  • 缓存穿透,缓存雪崩,缓存击穿[亲测有效]

    缓存穿透,缓存雪崩,缓存击穿[亲测有效]缓存穿透,缓存雪崩,缓存击穿 本文整理自黑马程序员相关资料 缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都部存在,这样缓存永远不会生效。因此这些请求都会穿过缓存,最终请求到数据库上,对数据

    2023-05-22
    147
  • mysql 8 安装整理「终于解决」

    mysql 8 安装整理「终于解决」1、下载地址 https://dev.mysql.com/downloads/mysql/ 参考文章 1、https://www.cnblogs.com/520BigBear/p/12764499….

    2023-03-28
    155
  • 分布式 | Global 表 Left Join 拆分表实现原因探究「建议收藏」

    分布式 | Global 表 Left Join 拆分表实现原因探究「建议收藏」作者:郭奥门 爱可生 DBLE 研发成员,负责分布式数据库中间件的新功能开发,回答社区/客户/内部提出的一般性问题。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联…

    2023-03-16
    159

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注