优秀测试工程师必须掌握的关系型和非关系型数据库
写在前面
如果平时没有接触到数据库,或者接触数据库不够深入,那么这篇文章很适合你,这篇文章主要从关系性和非关系型数据库的适用场景出发,介绍了MySQL,MongoDB,Redis数据库的安装,备份和常用命令以及MySQL的性能测试,作为一个测试工程师,通过该篇文档可以对数据库有个大体框架
数据库的分类
在当今的互联网中,最常见的数据库模型主要是两种,即SQL关系型数据库和NoSQL非关系型数据库。
关系型数据库是一种基于关系模型的数据管理系统,数据通过多个表以及表之间的关系进行存储和查询。其原理包括:
- 数据以表格(二维表)的形式存储
- 每个表格有一个固定的模式(即列的定义)
- 每行包含唯一的数据项(即主键)
- 表格之间通过外键关联
非关系型数据库也称为NoSQL数据库,通过键值对(key-value)、文档、图形等形式来存储和查询数据,并没有固定的模式。其原理包括:
- 数据以不同的方式组织和存储
- 灵活定义数据结构
- 分布式架构,可支持大数据量、高并发请求
关系型数据库适合处理事务性的数据,如银行账户等,支持复杂的查询操作、数据完整性以及数据一致性要求高的场景。非关系型数据库适合处理非结构化数据,如社交网络、实时日志等,可支持快速读写、横向扩展等特点。需要根据实际业务需求和数据特点选择适合的数据库系统。
常用的关系型数据库包括:
-
MySQL:开源免费的关系型数据库,提供高性能、高可靠性和可伸缩性。
-
Oracle:商业产品,支持大规模的企业级应用。
-
SQL Server:微软公司推出的数据库管理系统,具有强大的安全性和企业级管理功能。
-
PostgreSQL:开源免费的关系型数据库,被誉为世界上最先进的开源数据库之一。
常用的非关系型数据库包括:
-
MongoDB:开源免费的基于文档的数据库,支持海量数据存储和高并发读写。
-
Redis:高性能的Key-Value存储数据库,用于存储、缓存和消息队列等各种场景。
MySQL数据库
MySQL Linux安装
- 到指定目录下下载安装包
cd /usr/local/src
- 下载mysql8
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
- 解压mysql8, 通过xz命令解压出tar包(这里时间可能会久一点根据服务器性能决定请耐心等待) 然后通过tar命令解压出文件夹
xz -d mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
tar xvf mysql-8.0.20-linux-glibc2.12-x86_64.tar
- 将/usr/local/src下的mysql-8.0.20-linux-glibc2.12-x86_64文件夹内容移动到/usr/local/mysql下
mkdir /usr/local/mysql
mv /usr/local/src/mysql-8.0.20-linux-glibc2.12-x86_64/* /usr/local/mysql
cd /usr/local/mysql
- 创建用户组及用户和密码
groupadd mysql
useradd -g mysql mysql
- 授权用户
chown -R mysql.mysql /usr/local/mysql
- 编辑my.cnf文件
vim /etc/my.cnf,按 i 进入修改模式 然后将下面的文本复制进去
[mysqld]
user=root
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
port=3306
max_connections=200
max_connect_errors=10
character-set-server=utf8
default-storage-engine=INNODB
default_authentication_plugin=mysql_native_password
lower_case_table_names=1
group_concat_max_len=102400
[mysql]
default-character-set=utf8
[client]
port=3306
default-character-set=utf8
复制进去后按esc退出修改模式,然后按 shift+: 然后输入wq保存文件
- 进入到bin目录下
cd bin
- 初始化基础信息,最后一行后面会有个随机的初始密码保存下来一会登录要用(如果忘记了就删掉data文件夹重新初始化)
./mysqld --initialize
如果提示 :
./mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory
就执行下下面这个再执行初始化
yum -y install numactl
- 添加mysqld服务到系统
cp -a ./support-files/mysql.server /etc/init.d/mysql
- 授权以及添加服务
chmod +x /etc/init.d/mysql
chkconfig --add mysql
- 启动mysql
service mysql start
- 将mysql添加到命令服务
ln -s /usr/local/mysql/bin/mysql /usr/bin
- 登录mysql
mysql -uroot -p
-
输入刚刚初始化时生成的密码
-
更改root用户密码, 注意语句后的; 执行语句忘记写了 可以补个空的;回车也可以将语句执行
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
flush privileges;
- 更改root连接权限
use mysql;
update user set host='%' where user = 'root';
flush privileges;
- exit; 退出mysql,现在就可以通过连接工具比如:navicat登录root账户进行远程连接了
MySQL数据库必备语法
MySQL支持的数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
- 数值类型
- INT
- BIGINT
- FLOAT
- DOUBLE
- 日期和时间类型
- DATE
- DATETIME
- TIMESTAMP
- 字符串类型
- CHAR
- VARCHAR
- TEXT
- BLOB
- LONGTEXT
MySQL基本语法
- SQL 语句不区分大小写,但是数据库表名.列名和值是否区分,依赖于具体MySQL配置。
例如:SELECT 与 select .Select 是相同的。 - 多条 SQL 语句必须以分号(;)分隔。
- SQL 语句可以写成一行,也可以分写为多行。
#示例:一行 SQL 语句
UPDATE user SET username='robot', password='robot' WHERE username = 'root';
#示例:多行 SQL 语句
UPDATE user
SET username='robot', password='robot'
WHERE username = 'root';
4.SQL 支持三种注释
## 注释1
– 注释2
/* 注释3 */
DDL数据定义: 常用命令
数据定义语言(Data Definition Language,DDL)是 SQL 语言集中负责数据结构定义与数据库对象定义的语言。
DDL 的主要功能是定义数据库对象,DDL 的核心指令是 CREATE、ALTER、DROP。
数据库(DATABASE)
- 创建数据库:
CREATE DATABASE test;
- 创建数据库,并指定字符集:
CREATE DATABASE test CHARACTER SET utf8 COLLATE utf8_general_ci;
- 删除数据库:
DROP DATABASE test;
- 选择数据库:
USE test;
- 查询所有数据库:
SHOW DATABAES;
- 查询数据库所有表:
SHOW TABLES;
数据表(TABLE)
- 创建数据表-普通创建
CREATE TABLE test_user (
id int(10) NOT NULL COMMENT 'Id',
username varchar(64) NOT NULL DEFAULT 'dada' COMMENT '用户名',
password varchar(64) NOT NULL DEFAULT '*****' COMMENT '密码'
) COMMENT='测试用户表';
- 根据已有的表创建新表
CREATE TABLE vip_user AS
SELECT * FROM user;
- 删除数据表:DROP TABLE test_user;
- 查看表结构设计:desc test_user;
- 修改数据表
- 添加列:
ALTER TABLE test_user ADD age int(3);
- 删除列:
ALTER TABLE test_user DROP COLUMN age;
- 添加列:
MySQL WHERE常用技巧
WHERE 用于过滤记录,用于缩小访问数据的范围,常结合 SELECT,UPDATE 和 DELETE 一起使用。在WHERE中可以使用运算操作符,返回 true 或 false 的条件。
- SELECT 语句中的 WHERE 子句
SELECT * FROM test_user
WHERE username = 'A';
- UPDATE 语句中的 WHERE 子句
UPDATE test_user
SET username = 'B'
WHERE username = 'A';
- DELETE 语句中的 WHERE 子句
DELETE FROM test_user
WHERE username = 'B';
常用MySQL IN 和 BETWEEN及LIKE用法
- IN 操作符在 WHERE 子句中使用,作用是在指定的几个特定值中任选一个值。
- BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于某个范围内的值
- LIKE 操作符在 WHERE 子句中使用,作用是确定字符串是否满足匹配模式,其中LIKE 支持两个通配符匹
配选项:% 和 _。
- IN 示例:
SELECT * FROM test_user WHERE username IN ('A', 'B');
- BETWEEN 示例:
SELECT * FROM test_user WHERE id BETWEEN 3 AND 5;
- LIKE % 示例
SELECT * FROM test_user WHERE username LIKE '%appl%';
- LIKE _ 示例
SELECT * FROM test_user WHERE username LIKE '__pple';
常用MySQL AND、OR、NOT用法
AND.OR.NOT 是用于对过滤条件的逻辑处理指令,且AND 优先级高于 OR,为了明确处理顺序,可以使用 ()。
- AND 操作符表示左右条件都要满足。
- OR 操作符表示左右条件满足任意一个即可。
- NOT 操作符用于否定一个条件。
- AND 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_id = '001' AND prod_price <= 50;
- OR 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_id = '001' OR prod_id = '001';
- NOT 示例
SELECT *
FROM products
WHERE prod_price NOT BETWEEN 1 AND 100;
MySQL数据库数据导出备份和导入还原
MySQL数据库的导出备份和导入还原可以通过命令行方式和图形化界面工具方式实现。
命令行方式:
- 导出备份:使用mysqldump命令进行备份,可以导出整个数据库或者指定表、数据等。
mysqldump -u [用户名] -p [密码] [数据库名] > [导出文件名].sql
# 示例:导出整个数据库
mysqldump -u root -p123456 mydb > mydb_backup.sql
# 示例:导出指定表
mysqldump -u root -p123456 mydb mytable > mytable_backup.sql
- 导入还原:使用mysql命令进行还原,可以从备份文件中恢复数据。
mysql -u [用户名] -p [密码] [数据库名] < [导入文件名].sql
# 示例:还原整个数据库
mysql -u root -p123456 mydb < mydb_backup.sql
# 示例:还原指定表
mysql -u root -p123456 mydb < mytable_backup.sql
MySQL数据库性能基准测试
- 安装sysbench
请先访问sysbench官网并下载sysbench软件包,或者如果你使用的是Linux系统,也可以使用以下命令来安装sysbench:
# 安装:
yum install -y sysbench
# 查看版本:
sysbench --version
- 创建一个测试数据库和测试表
使用mysql命令来连接mysql服务:
mysql -u root -p
登录成功后,输入以下命令来创建一个测试数据库:
CREATE DATABASE test;
接下来,使用以下命令在test数据库中创建一个测试表:
USE test;
CREATE TABLE sbtest (
id INT PRIMARY KEY NOT NULL,
k INT NOT NULL,
c CHAR(120) NOT NULL,
pad CHAR(60) NOT NULL
);
- 运行sysbench测试
以下是一个简单的sysbench基准测试命令:
sysbench --test=oltp --db-driver=mysql --mysql-db=test --mysql-user=root --mysql-password=<password> prepare
其中,“password”应替换为你的mysql root用户密码。此命令将为sysbench测试准备一个数据库。
接下来,运行sysbench实际测试:
sysbench --test=oltp --db-driver=mysql --mysql-db=test --mysql-user=root --mysql-password=<password> --num-threads=<threads> --max-time=<time> run
其中,“threads”是并发线程的数量,“time”是执行测试的总时间。
最后,使用以下命令清理:
sysbench --test=oltp --db-driver=mysql --mysql-db=test --mysql-user=root --mysql-password=<password> cleanup
MongoDB
MongoDB是一种文档数据库,属于NoSQL数据库的一种,基于分布式文件存储的NoSQL数据库,由C++语言编写。MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,即键值对的集合。MongoDB支持的查询方式也很灵活,可以进行范围查询、正则表达式查询、任意深度的嵌套查询等。MongoDB具有高性能、可扩展性和灵活性等特点,适合应用于WEB应用、大数据、移动应用等领域。
典型的应用场景:
-
大数据处理和存储:MongoDB可以轻松处理海量的数据,方便进行大数据的存储和管理。
-
物联网应用:物联网应用产生了海量的数据,而MongoDB提供的高性能和可扩展性,非常适合物联网应用相关的数据处理和存储。
-
实时分析:MongoDB支持快速查询和聚合操作,能够实现实时分析。
-
社交网络:社交网络应用存在大量的用户数据,MongoDB能够快速处理和查询这些数据。
-
大规模电子商务:电子商务网站需要管理大量的数据,MongoDB能够提供高可用性、高性能、可扩展性,为电子商务应用提供强有力的支持。
Linux平台安装MongoDB
-
从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:
https://www.mongodb.com/download-center/community
-
上传到linux服务器上,将其解压:
tar -zxvf mongodb-linux-x86_64-rhel70-5.0.16-rc0.tgz
- 将解压后的文件夹移动到/usr/local/的mongodb目录下:
mv -r mongodb-linux-x86_64-5.0.16 /usr/local/mongodb
- 配置系统文件profile (sudo vi /etc/profile),插入下列内容:
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
注意保存后要重启系统配置:
source /etc/profile
- 创建用于存放数据和日志文件的文件夹,并修改其权限增加读写权限:
cd /usr/local/mongodb
sudo mkdir p data/dbsudo chmod r 777 data/db
sudo mkdir logs
cd logs
touch mongodb.log
- mongodb启动配置,进入到bin目录,增加一个配置文件:
cd /usr/local/mongodb/bin
sudo vi mongodb.conf
插入下列内容:
dbpath = /usr/local/mongodb/data/db #数据文件存放目录
logpath = /usr/local/mongodb/logs/mongodb.log #日志文件存放目录
port = 27017 #端口
fork = true #以守护程序的方式启用,即在后台运行
- 启动mongod数据库服务,以配置文件的方式启动:
cd /usr/local/mongodb/bin
./mongod -f mongodb.conf
MongoDB支持的数据类型
- String(字符串)
- Integer(整型)
- Double(浮点型)
- Boolean(布尔型)
- ObjectId(对象ID)
- Date(日期)
- Null(空值)
- Array(数组)
- Object(对象)
- Binary Data(二进制数据)
- Regular Expression(正则表达式)
- Javascript Code(JavaScript代码)
MongoDB工作常用命令
连接mongo
安装好mongo后,本地输入mongo即可进入mongo的页面,远程连接可以Mongo 远程链接地址,连接到mongo
进入mongo后,输入help可以查看mongo提供的帮助
MongoDB数据操作常用命令
MongoDB 是一个面向文档的 NoSQL 数据库,因此,在查询 MongoDB 数据库中的数据时,最基本的单位是文档对象(document),而集合(collection)则是文档对象的容器,而数据库(database)则是多个集合(collection)的容器,下面是 MongoDB 数据库级别、集合级别、文档级别及其对应的操作命令和示例:
- 数据库级别
数据库级别指的是 MongoDB 中的多个集合(collection)所共同隶属的一个数据库(database)。
操作命令:
- 切换当前的数据库:
use database_name
- 查看当前数据库中的所有集合:
show collections
- 查看当前数据库的状态:
db.stats()
- 集合级别
集合级别指的是 MongoDB 中的所有文档对象的容器。
操作命令:
- 创建集合:
db.createCollection('collection_name')
- 插入一个文档对象到集合中:
db.collection_name.insert(document)
- 查找集合中的所有文档对象:
db.collection_name.find()
- 统计集合中所有文档对象的总数:
db.collection_name.count()
示例:
db.createCollection('students')
db.students.insert({'name': 'John', 'age': 25})
db.students.insert({'name': 'Bill', 'age': 30})
db.students.find()
db.students.count()
- 文档级别
文档级别指的是 MongoDB 中存储的全部数据的最小单位,即文档对象。
操作命令:
- 更新文档对象:
db.collection_name.update(query, update, options)
- 删除文档对象:
db.collection_name.remove(query)
- 对文档对象进行计数:
db.collection_name.count()
示例:
db.students.update({'name': 'John'}, {'name': 'John Smith'})
db.students.remove({'name': 'Bill'})
db.students.count()
- 查询结果集的操作命令
查询结果集的操作命令用于对查询到的结果集进行一些操作。
操作命令:
- 对查询到的结果集进行过滤:
db.collection_name.find(query)
- 对查询到的结果集进行排序:
db.collection_name.find().sort(sort_fields)
- 对查询到的结果集进行分页:
db.collection_name.find().skip(skip_count).limit(page_size)
示例:
db.students.find({'age': {'$gt': 25}})
db.students.find().sort({'age': 1})
db.students.find().skip(0).limit(10)
MongoDB数据库备份,恢复,导出
MongoDB是一种NoSQL数据库,它使用JSON样式的文档来保存数据。当你需要备份,恢复或导出MongoDB数据时,你可以使用以下方法:
备份MongoDB数据
- 使用mongodump命令备份数据
mongodump是MongoDB提供的一个命令行工具,可以备份整个数据库或者指定的集合。以下是mongodump的命令:
mongodump --host --port --username --password --db --collection --out
例如,备份名为test的数据库到/home/mongodb/backups目录:
mongodump --db test --out /home/mongodb/backups
- 使用MongoDB管理工具备份数据
除了mongodump命令,MongoDB还提供了一些管理工具,例如MongoDB Compass和Studio 3T。可以使用这些工具进行备份数据。以下是MongoDB Compass备份数据的步骤:
- 打开MongoDB Compass,连接到你的MongoDB实例
- 选择要备份的数据库
- 点击“Export Data”按钮
- 选择导出格式和输出路径,然后点击“Export”按钮
恢复MongoDB数据
- 使用mongorestore命令恢复数据
mongorestore是MongoDB提供的一个命令行工具,可以恢复备份的数据。以下是mongorestore的命令:
mongorestore --host --port --username --password --db --collection
例如,恢复名为test的数据库备份文件:
mongorestore --db test /home/mongodb/backups/test/
- 使用MongoDB管理工具恢复数据
与备份数据一样,可以使用MongoDB Compass或Studio 3T等管理工具恢复数据。以下是MongoDB Compass恢复数据的步骤:
- 打开MongoDB Compass,连接到你的MongoDB实例
- 选择要恢复的数据库
- 点击“Import Data”按钮
- 选择备份文件和导入格式,然后点击“Import”按钮
导出MongoDB数据
- 使用mongoexport命令导出数据
mongoexport是MongoDB提供的一个命令行工具,可以将指定的集合导出为JSON、CSV和TSV文件格式。以下是mongoexport的命令:
mongoexport --host --port --username --password --db --collection --type --out
例如,导出名为test的数据库中名为users集合的数据到/home/mongodb/export目录:
mongoexport --db test --collection users --type json --out /home/mongodb/export/users.json
- 使用MongoDB管理工具导出数据
可以使用MongoDB Compass或Studio 3T等管理工具导出数据。以下是MongoDB Compass导出数据的步骤:
- 打开MongoDB Compass,连接到你的MongoDB实例
- 选择要导出的集合
- 点击“Export Data”按钮
- 选择导出格式和输出路径,然后点击“Export”按钮
Redis
Redis 是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库。由 C 语言开发的一个开源的高性能
键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。
官网地址:https://redis.io/
中文官方地址:http://www.redis.cn/
Redis作为一个高性能键值数据库,适用场景主要包括:
-
缓存:Redis最常用的场景就是缓存。将经常使用的数据存储在Redis中,减少访问后端数据源的次数,从而提高应用的性能。
-
消息队列:Redis支持发布/订阅模式,可以将它作为一个消息队列使用,实现异步处理任务,并且可以设置消息失效时间。
-
计数器:Redis支持以原子方式进行增减操作,因此可以用作计数器,如统计网站访问量、商品销量等。
-
分布式锁:Redis可以通过SETNX命令实现单节点上的分布式锁,并且Redis提供了Redlock算法实现多节点之间的分布式锁。
-
数据存储:除了键值对类型,Redis还支持其他数据结构,如列表、哈希表、集合等,可以像使用普通数据结构一样存储数据,同时也支持持久化。
-
地图信息:Redis自带的Geo命令可以支持地图相关的操作,如查询地理位置,计算距离等。
安装Redis
- 安装epel仓库文件:yum install epel-release
EPEL 的全称叫 Extra Packages for Enterprise Linux。它是由 Fedora 社区打造,为 RHEL 及衍生发行版,如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL 之后,就相当于添加了一个第三方源。
为什么需要 EPEL?那是因为 CentOS 源包含的大多数的库都是比较旧的,并且很多流行的库也不存在,而EPEL 在其基础上不仅全,而且还够新。
- 安装Redis:yum install redis
- 启动Redis:systemctl start redis 查看状态
# 服务相关命令
systemctl start redis
systemctl restart redis
systemctl stop redis
- 放开服务端口端口:
firewall-cmd --zone=public --add-port=6379/tcp --permanent
- 重启防火墙:systemctl restart firewalld
- 修改redis.conf配置,使用vi /etc/redis.conf进入配置修改,主要修改下面几个值
6.1 修改bind,让redis能够网络访问,值为bind 0.0.0.0
6.2 修改protected-mode为no,关闭保护模式,使得外部网络可以访问
6.3 通过requirepass配置访问密码 - 重启Redis:systemctl restart redis
- 云服务器在安全策略中开放相应的端口
- 为redis设置密码
可以在conf文件下为redis设置密码,vi命令,命令模式下,:行号可以跳转到指定位置,编辑模式修改即可
- 通过密码登录redis
redis-cli登录,auth 输入密码
- 通过Redis Desktop Manager客户端登陆
Redis数据类型
- String: 字符串
- Hash: 哈希
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
Redis常用命令
- Redis启动
在终端输入以下命令即可启动Redis:
# 本地启动
redis-cli
# 远程启动
redis-cli -h host -p port -a password
- 清空所有key
使用FLUSHALL命令可以清空redis中的所有键值:
FLUSHALL
- 查询匹配key
使用KEYS命令可以查询redis中符合指定模式的键值,例如查询所有以“user”开头的键值:
KEYS user*
- string字符串操作
- 设置键值:
SET key value
例如:
SET name "Tom"
- 获取键值:
GET key
例如:
GET name
- list列表操作
- 在列表头部添加元素:
LPUSH key value
例如:
LPUSH fruits apple
- 在列表尾部添加元素:
RPUSH key value
例如:
RPUSH fruits orange
- 获取整个列表:
LRANGE key start stop
例如:
LRANGE fruits 0 -1
- set无序集合操作
- 添加元素:
SADD key member
例如:
SADD fruits banana
- 获取整个集合:
SMEMBERS key
例如:
SMEMBERS fruits
- zset有序集合操作
- 添加元素:
ZADD key score member
例如:
ZADD fruits 2 cherry
- 获取整个集合:
ZRANGE key start stop
例如:
ZRANGE fruits 0 -1
- hash操作
- 添加元素:
HSET key field value
例如:
HSET user:1 name Tom
- 获取整个哈希表:
HGETALL key
例如:
HGETALL user:1
- 设置key生存时间
使用EXPIRE命令可以设置redis中的键值过期时间,单位为秒:
EXPIRE key seconds
例如:
EXPIRE name 3600
Redis数据库备份和恢复
Redis提供了两种数据备份方式:RDB(Redis Database) 和 AOF(Append Only File)。下面分别介绍如何使用这两种方式进行数据备份和恢复:
- RDB备份和恢复数据
RDB是Redis默认的数据备份方式,它会定期将当前内存中的数据保存到磁盘上的RDB文件中。
- 备份数据
可以使用redis-cli客户端执行SAVE命令来手动备份数据:
$ redis-cli
127.0.0.1:6379> SAVE
OK
执行以上命令后,Redis会在当前工作目录下生成一个dump.rdb文件,其中保存了当前Redis数据库的快照。
- 恢复数据
将备份的RDB文件复制到Redis服务器所在的目录中,然后重启Redis服务器即可恢复数据。Redis会自动加载RDB文件并恢复数据。
- AOF备份和恢复数据
AOF是一种更加安全的数据备份方式,它会将每一条写命令追加到AOF文件的末尾,以保证数据的持久化。
- 备份数据
可以使用redis-cli客户端执行BGSAVE命令来异步备份数据到磁盘上的AOF文件中:
$ redis-cli
127.0.0.1:6379> BGSAVE
Background saving started
执行以上命令后,Redis会在后台异步进行备份操作,期间可以继续对Redis进行读写操作。备份完成后,Redis会在日志中打印出相应的日志信息。
- 恢复数据
使用AOF方式备份数据时,如果服务器出现异常宕机,可以通过AOF文件中的操作记录来恢复数据。启动Redis服务器后,Redis会自动加载AOF文件并恢复数据。如果AOF文件过大,可以先使用BGREWRITEAOF命令来将AOF文件进行压缩。
Redis测试要点
- 缓存有效性:测试缓存是否能够正常存储和读取数据。
- 缓存删除:测试删除缓存时是否能够正确地删除对应的缓存项。
- 缓存过期失效:测试缓存中对应的数据是否会在设置的过期时间到达之后自动失效。
- 缓存上限:测试缓存服务器是否会在存储超过指定容量时停止接受新的缓存数据。
- 缓存服务器停止:测试当缓存服务器停止运行时,客户端应如何处理缓存数据。
- 缓存超时:测试当客户端等待与缓存服务器通信时,客户端是否会在指定时间内超时。
- 缓存穿透:测试当缓存中不存在指定数据并且同时存在大量查询请求时,是否会出现缓存穿透现象。
- 缓存雪崩:测试当缓存中大量数据同时失效时,是否会出现缓存雪崩现象。
缓存穿透是指查询一个不存在的数据时,在缓存中找不到,从而导致查询转到后端数据库,这时大量的请求可能会造成数据库压力过大,甚至会导致宕机。缓存穿透的解决方案可以采用Bloom Filter算法、预加载技术等来防止非法请求进入数据库。
缓存雪崩是指由于缓存中很多数据的失效时间相同,从而导致在同一时间大量的请求到达数据库。缓存雪崩的解决方案包括采用分布式缓存、随机缓存失效时间等来防止失效时间集中在同一时间导致的失效压力。
对于缓存穿透和缓存雪崩问题,可以采取以下解决方案:
- 缓存穿透:可以使用布隆过滤器对缓存查询进行过滤,或者将查询结果为空的值也缓存下来(称为“缓存空对象”)。
- 缓存雪崩:可以采用将缓存过期时间设置为随机时间,或者将数据存储在多个缓存服务器中以防止同时失效。