1. 服务器中数据库结构

Redis 服务器将所有数据库都保存在服务器状态 redisServer 结构的 db 数组中,由 redisDb 结构代表一个数据库

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

Redis 服务器默认会创建16个数据库,默认情况下,Redis客户端的目标数据库是0号数据库。

2. 切换数据库

SELECT 命令用来切换数据库

    redis> SELECT 2
OK
redis[2]> //切换到了2号数据库

注意:

在执行Redis命令,特别是像FLUSHDB这样的危险命令之前,最好先执行一个SELECT命令,显示的切换到指定的数据库,然后在执行别的命名。

3. 数据库键空间

Redis是一个键值对数据库服务器,服务器中的每个数据库都由一个redisDb结构表示。其中,redisDb结构的dict字典保存了数据库中所有键值对,我们将这个字典称为键空间。

    typedef struct redisDb {
// ...
// 数据库键空间,保存着数据库中所有的键值对
dict *dict;
} redisDb;
  • 键空间的键也就是数据库的键,每个键都是一个字符串对象
  • 键空间的值也就是数据库的值,每个值可以是字符串对象、列表对象、哈希表对象、集合对象和有序集合对象中的任意一种Redis对象。

4. 键过期

4.0 保存过期时间

reidsDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:

  • 过期字典的键是一个指针,这个指针指向键空间中的某个键对象(也即某个数据库键,不用再次创建相同的键对象,节省内存)
  • 过期字典的值是一个 long long 类型的整数,这个整数保存了键所指向的数据库键的过期时间——一个毫秒精度的UNIX时间戳。
    typedef struct redisDb {
// ...
// 过期字典,保存着键的过期时间
dict *expires;
// ...
} redisDb;

4.1 设置键过期命令

Redis有四个不同的命令用于设置键的生存时间或者过期时间

  • EXPIRE <key> <ttl> 命令用于将键key的生存时间设置为ttl秒
  • PEXPIRE <key> <ttl> 命令用于将键key的生存时间设置为ttl毫秒
  • EXPIREAT <key> <timestamp> 命令用于将键key的过期时间设置为timestamp所指定的秒数时间戳
  • PEXPIREAT <key> <timestamp> 命令用于将键key的过期时间设置为timestamp所指定的毫秒数时间戳

EXPIRE、PEXPIRE、EXPIREAT 三个命令都是调用PEXPIREAT命令来实现的。

4.2 移除键过期命令

  • PERSIST <key>命令用于移除键key的过期时间
    redis>EXPIRE msg 1000   // 设置键msg1000秒后过期
1
redis>TTL msg
996
redis>PERSIST msg
1
redis>TTL msg
-1 // 返回值为-1,说明msg没有设定过期时间

4.3 计算并返回剩余生存时间

  • TTL命令以秒为单位返回键的剩余生存时间
  • PTTL命令以毫秒为单位返回键的剩余生存时间

4.4 过期键的删除策略

4.4.1三种不同的删除策略:

  • 定时删除:在设置键过期时间的同时创建一个定时器,让定时器在键的过期时间来临时,立即执行键的删除操作
  • 惰性删除:获取键时,执行删除操作
  • 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里边的过期键

4.4.2 三种删除策略比较

  • 定时删除:对内存友好,通过定时器保证过期键尽快删除并释放内存;对CPU不友好,当过期键比较多时,占用大量CPU时间,影响redis服务器的响应时间和吞吐量
  • 惰性删除:对CPU友好,程序只会在取出键时才会进行过期检查;对内存不友好,如果有大量过期键且这些过期键有不会用到的话,内存永远得不到释放,造成内存浪费,可以看做一种内存泄漏。
  • 定期删除:是定时删除和惰性删除的一种折中,不过必须根据实际情况,合理设置删除操作的执行时长和执行频率

4.4.3 Redis选用的删除策略

Redis服务器使用惰性删除和定期删除两种策略相结合的方式,通过这种方式来合理使用CPU和避免浪费内存。

4.5 AOF、RDB和复制功能对过期键的处理

4.5.1 生成RDB文件

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

4.5.2 载入RDB文件

  • 如果服务器以主服务器模式运行,那么载入RDB文件时,会对文件中保存的键进行检查,未过期的键不会被载入到数据库中
  • 如果服务器以从服务器模式运行,那么载入RDB文件时,不论键过期与否,全部载入到数据库中

4.5.3 AOF文件写入

当服务器以AOF持久化模式运行时,如果数据库中的某个键已经过期,但还没有被删除,那么AOF文件写入不会因为这个键过期受到影响。

当键被惰性删除或者定期删除后,程序会向AOF文件追加一条 DEL 命令,来显式地记录该键已经被删除。

4.5.4 AOF 重写

在执行 AOF 重写时,已过期的键不会被保存到重写后的AOF文件中

4.5.5 复制

当服务器运行在复制模式下,从服务器的过期键删除动作由主服务器控制:

  • 主服务器在删除一个键后,会显式的向所有从服务器发送一个 DEL 命令,告知从服务器删除这个过期键
  • 从服务器在执行客户端发送的读命令时,即使碰到过期键也不会将过期键删除,而是继续像处理未过期的键一样来处理过期键
  • 从服务器接收到主服务器发送来的DEL命令后,才会删除过期键

《Redis设计与实现》- 数据库的更多相关文章

  1. 探索Redis设计与实现9:数据库redisDb与键过期删除策略

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  2. Redis | 第4章 Redis中的数据库《Redis设计与实现》

    目录 前言 1. Redis中的数据库 2. 数据库的键空间 3. 键的生成时间与过期时间 4. Redis中的过期键删除策略 5. AOF.RDB和复制功能对过期键的处理 5.1 生成 RDB 文件 ...

  3. Redis设计与实现2.1:数据库和事件

    数据库和事件 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 数据库 数据库的结构定义在 redis.h/redisServer 这个结构体中,这个结构体有许多 ...

  4. Redis设计与实现——单机数据库的实现

    数据库 服务器中的数据库 redisClient切换数据库 redis客户端默认目标数据库为0号数据库,可以通过SELECT命令来切换目标数据库. 客户端状态redisClient结构的db属性记录了 ...

  5. Redis设计与实现(一~五整合版)【搬运】

    Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很 ...

  6. 《Redis设计与实现》读书笔记

    <Redis设计与实现>读书笔记 很喜欢这本书的创作过程,以开源的方式,托管到Git上进行创作: 作者通读了Redis源码,并分享了详细的带注释的源码,让学习Redis的朋友轻松不少: 阅 ...

  7. 重读redis设计与实现

    重读了一遍redis设计与实现,这次收获也不错,把之前还有些疑惑的点:redis跳跃表的原理.redis持久化的方法.redis复制.redis sentinel.redis集群等,都重新熟悉了一遍, ...

  8. 如何使用redis设计关系数据库

    目录 redis设计关系数据库 前言 设计用户信息表结构 hash存储记录 set存储id 图示 索引/查询: 1.select 查询所有记录 : 类似sql的select from table_na ...

  9. Redis笔记(3)多数据库实现

    1.前言 本章介绍redis的三种多服务实现方式,尽可能简单明了总结一下. 2.复制 复制也可以称为主从模式.假设有两个redis服务,一个在127.0.0.1:6379,一个在127.0.0.1:1 ...

随机推荐

  1. 使用拦截器拦截html参数

    公司最新需求:根据传递的参数进行业务判断,如果符合条件则继续后面的业务逻辑,否则跳转到指定的错误页面.有些是请求的controller 使用了spring  aop的方式进行验证:但是有些是html页 ...

  2. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.gaiay.business.helper.dao.LiveRegenrationRecordMapper.insert

    原因分析: 字段名称.报名.类名 对应不上 ,比如colomn和property属性 反了.. 按以下步骤一一执行: 1:检查xml文件所在的package名称是否和interface对应的packa ...

  3. PMP项目管理

    http://blog.sina.com.cn/s/blog_a3922d430102wv38.html https://www.zhihu.com/question/19882243 最近学习pmp ...

  4. 小程序填坑之路(二):cover-view

    https://blog.csdn.net/mr_chen95/article/details/79261987 在一些情况下,我们需要对map.video.canvas.camera这些微信小程序的 ...

  5. mssql修改id

    alter   table   image   alter   column   id     int   IDENTITY   (1,   1)   NOT   NULL 我只能上查询分析器,所以只 ...

  6. 关于webWorker的理解和简单例子

    一.理解 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成. web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能.您可以继续做任何愿 ...

  7. asp.net生成PDF文件(一)

    这个是例子是网上淘来的,哈哈,很有用的! 首先要到网上下载itextsharp.dll,然后添加引用,主程序如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 ...

  8. F5 IIS Log获取客户端源IP

    1.配置F5启用X-Forwarded-For方法: 1:Local Traffic-Profiles-Http-改"Insert XForwarded For"为Enable 2 ...

  9. Stop-VM

    stop-vm vm01 -force  正常关机,留给Guest 5分钟保存数据,然后关闭 stop-vm vm02 -turnoff 断电关机 Windows Server 2008 R2默认没有 ...

  10. ONOS的安装

    ONOS的简介 ONOS(Open Network Operating System)开放网络操作系统,由 ON.Lab 使用 Java 及 Apache 实现发布的首款开源的SDN网络操作系统. O ...