redis-数据库

数据库

Redis支持多个数据库,而且每一个数据库的数据是隔离的不能共享,而且基于单机才有,若是是集群就没有数据库的概念。 Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端能够指定将数据存储在哪一个字典中。这与咱们熟知的在一个关系数据库实例中能够建立多个数据库相似,因此能够将其中的每一个字典都理解成一个独立的数据库。html

每一个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(能够经过配置文件支持更多,无上限),能够经过配置databases来修改这一数字。客户端与Redis创建链接后会自动选择0号数据库,不过能够随时使用SELECT命令更换数据库,如要选择1号数据库:redis

redis> SELECT 1
OK
redis [1] > GET foo
(nil)
复制代码

数据库键空间

Redis 是一个键值对(key-value pair)数据库服务器, 服务器中的每一个数据库都由一个 redis.h/redisDb 结构表示, 其中, redisDb 结构的 dict 字典保存了数据库中的全部键值对, 咱们将这个字典称为键空间(key space):数据库

typedef struct redisDb {

    // ...

    // 数据库键空间,保存着数据库中的全部键值对
    dict *dict;

    // ...

} redisDb;
复制代码

键过时策略

redisDb结构的expries字典保存了数据库全部的键过时时间,咱们称这个字典为过时字典: 过时字典的键是一个指针,这个指针指向键空间中的某个键对象(也便是某个数据库键)。 过时字典的值是一个 long类型的整数,这个整数保存饿键所指向的数据库键的过时时间,一个毫秒精度的UNIX时间戳。看下图是带有过时的时间的存储机构。其中过时字典的键实际上是一个指针,对应同一个内存存储。数组

过时键的删除策略是按期删除策略+惰性删除策略 惰性删除的策略以下图:bash

按期删除策略: 过时键的按期删除策略由redis.c/activeExpireCycle函数实现,每当Redis的服务器周期性操做 redis.c/serverCron 函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分屡次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分的过时时间,并删除其中过时键。 函数每次运行时,都从必定数量的数据库中取出必定数量的随机键进行检查,并删除其中的过时键。

AOF,RDB和复制功能对过时键的处理

生成RDB文件,执行SAVE和BGSAVE命令时,程序会直接忽略过时的键。 载入RDD文件时 1.服务器以主服务器运行时,载入RDB会直接忽略过时的键 2.服务器以从服务器运行时,载入RDB不出来过时键,可是主同步的从服务器时,数据将 最终保存一致。 生成AOF文件时类型,AOF都是追加的命令,当过时时,会在AOF中追加DEL命令。当AOF重写时,是以数据当时的状态重写,则过时的键会直接被忽略。 复制时,主服务器会主动删除过时的数据,而后同步从服务器。从服务器只是读取。服务器

subscribe 命令监听数据库的通知。

详情能够看命令 重点:函数

  • Redis 服务器的全部数据库都保存在 redisServer.db 数组中, 而数据库的数量则由 redisServer.dbnum 属性保存。
  • 客户端经过修改目标数据库指针, 让它指向 redisServer.db 数组中的不一样元素来切换不一样的数据库。
  • 数据库主要由 dict 和 expires 两个字典构成, 其中 dict 字典负责保存键值对, 而 expires 字典则负责保存键的过时时间。 由于数据库由字典构成, 因此对数据库的操做都是创建在字典操做之上的。
  • 数据库的键老是一个字符串对象, 而值则能够是任意一种 Redis 对象类型, 包括字符串对象、哈希表对象、集合对象、列表对象和有序集合对象, 分别对应字符串键、哈希表键、集合键、列表键和有序集合键。
  • expires 字典的键指向数据库中的某个键, 而值则记录了数据库键的过时时间, 过时时间是一个以毫秒为单位的 UNIX 时间戳。
  • Redis 使用惰性删除和按期删除两种策略来删除过时的键: 惰性删除策略只在碰到过时键时才进行删除操做, 按期删除策略则每隔一段时间, 主动查找并删除过时键。
  • 执行 SAVE 命令或者 BGSAVE 命令所产生的新 RDB 文件不会包含已通过期的键。
  • 执行 BGREWRITEAOF 命令所产生的重写 AOF 文件不会包含已通过期的键。
  • 当一个过时键被删除以后, 服务器会追加一条 DEL 命令到现有 AOF 文件的末尾, 显式地删除过时键。
  • 当主服务器删除一个过时键以后, 它会向全部从服务器发送一条 DEL 命令, 显式地删除过时键。
  • 从服务器即便发现过时键, 也不会自做主张地删除它, 而是等待主节点发来 DEL 命令, 这种统1、中心化的过时键删除策略能够保证主从服务器数据的一致性。
  • 当 Redis 命令对数据库进行修改以后, 服务器会根据配置, 向客户端发送数据库通知。
相关文章
相关标签/搜索