内容简介:Redis壶中天-数据库
数据库的基本内容
数据库、RDB、AOF、事件
本文所使用的 Redis 版本为3.2.8
数据库
服务器中的数据库
redisServer中的db数组保存服务器中的所有数据库,每个数据库都用一个redisDb结构表示。
切换数据库
默认情况下,客户端的目标数据库的index为0,如下选择2号数据库进行存储:
127.0.0.1:6379> set msg "yrq" OK 127.0.0.1:6379> get msg "yrq" 127.0.0.1:6379> select 2 OK 127.0.0.1:6379[2]> get msg (nil) 127.0.0.1:6379[2]> set msg "hello world" OK 127.0.0.1:6379[2]> get msg "hello world"
键空间
redisDb中的dict字典保存数据库中的所有键值对,也称键空间。
键值对的CURD操作
127.0.0.1:6379> set msg "hello" OK 127.0.0.1:6379> del msg (integer) 1 127.0.0.1:6379> set msg "hallo" OK 127.0.0.1:6379> get msg "hallo"
键的生存或过期时间
使用expire命令可以设置键的过期时间,值可以为秒数或unix时间戳。
127.0.0.1:6379> set name "yrq" OK 127.0.0.1:6379> expire name 10 (integer) 1 127.0.0.1:6379> get name "yrq" 127.0.0.1:6379> get name (nil)
使用ttl和pttl命令查看剩余的生存时间,使用persist命令移除过期时间。
127.0.0.1:6379> set msg "hello" OK 127.0.0.1:6379> expire msg 2000 (integer) 1 127.0.0.1:6379> ttl msg (integer) 1993 127.0.0.1:6379> pttl msg (integer) 1986927 127.0.0.1:6379> persist msg (integer) 1 127.0.0.1:6379> ttl msg (integer) -1
redisDb中的expires字典保存了数据库中所有键的过期时间,当键过期时Redis服务器会采用惰性删除和定期删除结合的方式清理过期键。
RDB
RDB机制会将当前的数据库状态保存到一个文件中,是一种持久化机制。rdb文件用于保存和还原redis服务器所有数据库中的所有键值对数据。
创建与载入
执行save或bgsave命令时redis会将数据库状态保存进rdb文件中,不会包含已过期的键。
-
直接保存 - save
save命令执行时redis服务器会被阻塞,当save正在执行时,所有客户端发送的请求都被会阻塞
127.0.0.1:6379> save OK
-
子进程保存 - bgsave
bgsave命令执行时会使用子进程进行rdb文件的创建与保存操作,当bgsave正在执行时,redis服务器可以继续处理客户端发送的命令请求
127.0.0.1:6379> bgsave Background saving started
-
载入
在rdb文件的载入过程中,会一直处于阻塞状态。启动redis服务器时,若开启了RDB功能则载入rdb文件。
设置保存条件
假设保存条件如下:
save 900 1 save 300 10 save 60 10000
只要满足这三个条件中的一条就会自动执行bgsave命令:
- 服务器在900秒内对数据库进行了至少1次修改
- 服务器在300秒内对数据库进行了至少10次修改
- 服务器在60秒内对数据库进行了至少10000次修改
文件结构
一个完整的rdb文件通常包含这几个部分:
- REDIS - ‘REDIS’字符串
- db_version - 整数字符,表示rdb文件版本
- database - 包含一个或多个数据库与其中的键值对数据
- EOF - 常量,标志rdb文件正文结束
- check_sum - rdb文件校验和
AOF
AOF(Append Only File)是另一种持久化机制,它是通过保存redis服务器执行的写命令来记录数据库状态的。
持久化过程
-
命令追加
当数据库执行写命令后,会以协议格式将写命令存入服务器状态的aof_buf缓冲区 -
写入与加载
在redis服务器的每个事件循环进程中,都会执行一个flushAppendOnlyFile函数。
appendfsync值对flushAppendOnlyFile函数行为的影响:
- always - 将缓冲区内容写入并同步到AOF文件
- everysec - 将缓冲区内容写入到AOF文件中,每超过1秒钟都会对AOF文件进行一次同步
- no - 将缓冲区内容写入AOF文件,不同步
载入与还原
- 服务器启动载入程序
- 创建伪客户端
- 从AOF文件中分析并读取出写命令
- 使用伪客户端执行被读出的写命令
- 重复执行步骤3和4,直到aof文件中的所有写命令被执行
重写
为了解决随着服务器运行时间流逝而产生的AOF文件体积膨胀问题,提供了AOF文件的重写功能,可以过滤掉冗余的写入命令,缩小文件体积。
重写实现
AOF重写并不读取、分析现有AOF文件,而是直接读取服务器当前的数据库状态。
若旧的AOF文件中保存有对某一个键的多个操作,则重写时通过读取数据库中这个键的值,使用一条命令记录键值对,代替之前的多条命令。
后台重写
若直接用aof_rewrite函数会造成服务器的阻塞,在重写期间无法接受客户端的命令请求,需要一种使用子进程的后台重写实现。
bgwriteaof命令是后台重写命令,执行时服务器会维护一个AOF重写缓冲区,该缓冲区会在子进程创建新AOF文件期间保存服务器执行的所有写命令。当子进程完成AOF文件的创建时会将重写缓冲区中的写命令追加到AOF文件末尾,使新旧AOF文件保存的数据库状态一致,以新替旧,完成重写。
事件
Redis服务器是一个事件驱动的程序,需要处理的事件分为两类:文件事件和时间事件
文件事件
Redis服务器通过套接字与客户端进行连接,文件事件就是服务器对套接字操作的抽象。服务器与客户端的通信会产生其他文件,而服务器通过监听并处理这些事件来完成一系列网络通信操作。
文件处理器是给予Reactor模式实现的网络通信程序,由以下几个部分组成:
- 套接字
- I/O多路复用程序
- 文件事件分派器
- 事件处理器
文件事件分为读事件和写事件。
事件处理器中包含处理多种不同网络通信需求的处理器:连接应答处理器、命令请求处理器、命令回复处理器等。
时间事件
Redis服务器中的一些操作需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。
时间事件分为定时事件和周期事件,定时事件只在指定的时间到达一次,周期时间每隔一段时间到达一次。
一个时间事件都由id(全局唯一id)、when(UNIX时间戳)和timeProc(时间事件处理器)三部分组成。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 4 万字全面掌握数据库、数据仓库、数据集市、数据湖、数据中台
- Python3爬虫数据入数据库---把爬取到的数据存到数据库,带数据库去重功能
- Oracle数据库查询重复数据及删除重复数据方法
- sqlserver数据库获取数据库信息
- 从大数据到数据库
- node连接oracle数据库,更新数据后,数据库中不生效问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入浅出Web设计(中文版)
(美)瓦特罗尔、(美)西罗托 / O'Reilly Taiwan公司 / 东南大学出版社 / 2010-11 / 99.00元
你将从《深入浅出Web设计(中文版)》学到什么?你曾经希望看看书就能学到真正的网站设计吗?曾经想过该如何同时达成让网站看起来美观,又能有效率地沟通信息,还要通过可访问性与可用性的策略吗?《深入浅出Web设计》正是精通上述主题的秘笈。我们将学到如何设计一个绝佳、用户友好的网站,上谈客户需求,下说手绘分镜表,乃至完成在线所需的HTML与css主文件……而且会有一个真正可以运作的网站!一起来看看 《深入浅出Web设计(中文版)》 这本书的介绍吧!