一,Redie 介绍
1,关系数据库与非关系型数据库
1:关系型数据库
关系型数据库是基于关系模型的数据库,该模型由E.F. Codd在1970年代提出。关系型数据库使用表格结构来组织数据,并通过行和列的形式存储信息。每一张表都有一个唯一的名称,并且包含多个字段(列),每个字段定义了特定的数据类型。
关键特点:
- ACID属性:保证事务处理的原子性、一致性、隔离性和持久性。
- 模式化数据:数据必须符合预定义的模式或结构。
- SQL支持:使用SQL(Structured Query Language)进行查询和操作数据。
- 强一致性:数据更新后立即可见,所有节点看到的数据是一致的。
2:非关系型数据库
非关系型数据库是指不采用传统的关系模型来存储数据的数据库系统。它们通常被设计用于处理大数据量、高并发访问的应用场景,并且可以轻松地扩展到多个服务器上。
类型包括:
- 键值存储:如Redis、Voldemort等。
- 文档数据库:如MongoDB、Couchbase等。
- 列族存储:如Cassandra、HBase等。
- 图数据库:如Neo4j、JanusGraph等。
关键特点:
- 可扩展性:能够水平扩展以应对大量数据和高并发访问。
- 灵活性:数据模式可以动态变化。
- 最终一致性:在分布式环境中可能需要等待一段时间才能达到一致状态。
- 高性能:对于某些类型的操作比关系型数据库更快。
3:非关系型数据库产生背景
随着互联网的发展,数据量急剧增长,传统的关系型数据库开始难以满足以下需求:
- 大规模数据存储:关系型数据库在存储非常大的数据集时性能会下降。
- 高并发读写:互联网应用需要处理成千上万用户的并发请求。
- 灵活的数据模型:许多现代应用程序要求数据模型具有高度的灵活性。
- 分布式部署:为了提供全球服务,需要数据库能够轻松地在多个数据中心之间分布。
2,Redis 基础
1:Redis 简介
Redis (REmote DIctionary Server) 是一个开源的、高性能的键值存储系统。它支持多种数据结构,例如字符串、哈希、列表、集合、有序集合等。Redis 最初由 Salvatore Sanfilippo 在 2009 年开发,并且已经成为最流行的 NoSQL 数据库之一。Redis 不仅可以用作数据库,还可以用作缓存和消息中间件。
主要特点:
- 内存存储:数据存储在内存中,这使得 Redis 能够实现非常快的数据访问速度。
- 持久化:虽然 Redis 主要是一个内存数据库,但它提供了两种机制来将数据持久化到磁盘,即 RDB 快照和 AOF(Append Only File)日志。
- 数据结构丰富:除了基本的键值对,还支持列表、集合、有序集合和哈希等复杂数据结构。
- 网络通信:客户端和服务器通过 TCP 或 Unix socket 进行通信。
- 发布/订阅功能:支持发布/订阅模式,可以构建消息队列系统。
- 主从复制:支持简单的主从复制模型,用于数据备份和读写分离。
2:Redis 安装部署
2.1 安装 Redis
安装 Redis 的步骤取决于您的操作系统。以下是针对一些常见操作系统的简要说明:
对于 Linux 系统:
-
下载源码包:
wget https://download.redis.io/releases/redis-7.0.11.tar.gz tar xzf redis-7.0.11.tar.gz cd redis-7.0.11
-
编译安装:
make make install
对于 Windows 系统:
- 下载 Windows 版本的 Redis 二进制文件。
- 解压到一个合适的目录,比如
C:\Redis
。
对于 macOS 系统:
-
使用 Homebrew 安装 Redis:
brew install redis
2.2 启动 Redis 服务器
一旦安装完成,您可以通过启动 Redis 服务器来运行 Redis。
对于 Linux 和 macOS:
redis-server
对于 Windows: 打开命令提示符并运行:
redis-server.exe
3:配置参数
Redis 的配置文件通常位于安装目录中的 redis.conf
文件。您可以编辑此文件来更改 Redis 的各种设置。以下是一些常用的配置选项:
- bind : 指定服务器绑定的 IP 地址,默认为
127.0.0.1
,如果需要从任何 IP 地址访问,可以设置为0.0.0.0
。 - port : Redis 服务器监听的端口号,默认为
6379
。 - timeout: 设置客户端空闲超时时间(秒),默认未设置(0)表示永不超时。
- databases: 可以使用的数据库数量,默认为 16。
- save : 配置 RDB 快照保存策略,例如
save 900 1
表示如果在 15 分钟内至少有一个键被修改,则保存一次快照。 - appendonly : 开启或关闭 AOF 日志,可以设置为
yes
或no
。 - requirepass: 设置访问密码,增强安全性。
- maxmemory: 设置 Redis 实例的最大内存限制。
- maxmemory-policy: 当达到最大内存限制时的处理策略。
3,Redis 命令工具
1:redis-cli 命令行工具
redis-cli
是 Redis 提供的一个命令行客户端工具,它允许用户直接与 Redis 服务器交互。使用 redis-cli
,您可以执行 Redis 支持的所有命令,查看数据,调试脚本,以及管理服务器。
启动 redis-cli
启动 redis-cli
非常简单,只需在终端或命令提示符中输入 redis-cli
即可。如果 Redis 服务器正在运行并且默认配置没有更改,那么 redis-cli
将尝试连接到本地主机上的默认端口 6379
。
redis-cli
常用命令
以下是一些常用的 redis-cli
命令:
-
查看服务器信息:
INFO
: 显示服务器的详细信息。INFO server
: 显示服务器部分的信息。
-
键操作:
SET key value
: 设置键key
的值为value
。GET key
: 获取键key
的值。DEL key
: 删除键key
。
-
字符串操作:
INCR key
: 对键key
的值增 1。DECR key
: 对键key
的值减 1。INCRBY key increment
: 对键key
的值增加指定的increment
值。GETRANGE key start end
: 返回键key
中子字符串。
-
哈希操作:
HSET key field value
: 设置哈希key
中字段field
的值为value
。HGET key field
: 获取哈希key
中字段field
的值。HDEL key field [field ...]
: 删除哈希key
中的一个或多个字段。
-
列表操作:
LPUSH key value [value ...]
: 将一个或多个值插入到列表key
的头部。RPUSH key value [value ...]
: 将一个或多个值插入到列表key
的尾部。LPOP key
: 移除并获取列表key
的第一个元素。RPOP key
: 移除并获取列表key
的最后一个元素。
-
集合操作:
SADD key member [member ...]
: 向集合key
添加一个或多个成员。SMEMBERS key
: 获取集合key
中的所有成员。SREM key member [member ...]
: 从集合key
中移除一个或多个成员。
-
有序集合操作:
ZADD key score member [score member ...]
: 向有序集合key
添加一个或多个成员及其分数。ZRANGE key start stop [WITHSCORES]
: 获取有序集合key
中指定范围内的成员。ZREM key member [member ...]
: 从有序集合key
中移除一个或多个成员。
-
管道操作:
MULTI
: 开始一个事务。EXEC
: 执行事务中积累的命令。DISCARD
: 清除事务缓冲区。
-
其他操作:
SELECT index
: 切换到指定的数据库。QUIT
: 退出redis-cli
。
2:redis-benchmark 测试工具
redis-benchmark
是 Redis 自带的一个基准测试工具,用于测试 Redis 的性能。它可以帮助您评估 Redis 在特定环境下的性能表现,例如读写速度、延迟等。
启动 redis-benchmark
启动 redis-benchmark
同样很简单,只需要在终端或命令提示符中输入相应的命令即可。
redis-benchmark
常用选项
这里有一些 redis-benchmark
的常用选项:
-h host
: 指定 Redis 服务器的主机地址,默认为127.0.0.1
。-p port
: 指定 Redis 服务器的端口号,默认为6379
。-n count
: 指定要发送的命令的数量。-c count
: 指定并发连接的数量。-q
: 只显示汇总统计信息,不输出详细的命令结果。--threads count
: 指定使用的线程数(Redis 4.0 以上版本)。--command command
: 指定要测试的命令。
示例
以下是一个简单的 redis-benchmark
使用示例,测试 Redis 服务器的 GET
命令性能:
redis-benchmark -n 100000 -c 50 -t get,set
这个命令将创建 50 个并发连接,并发送 100,000 个 GET
和 SET
命令到 Redis 服务器,以测试其读写性能。
4,Redis 数据库常用命令
1:key 相关命令
Redis 中的键(Key)是用来存储数据的基本单位,可以用来存储各种类型的数据结构。下面列出了一些与键相关的常用命令:
基本操作
SET key value
: 设置键key
的值为value
。GET key
: 获取键key
的值。DEL key [key ...]
: 删除一个或多个键。EXISTS key
: 检查给定键是否存在。TYPE key
: 返回键key
的数据类型。KEYS pattern
: 查找匹配给定模式的所有键。(注意:KEYS
命令在生产环境中不推荐使用,因为它可能会导致性能问题。)
超时和过期
EXPIRE key seconds
: 为键key
设置过期时间(秒)。PEXPIRE key milliseconds
: 为键key
设置过期时间(毫秒)。EXPIREAT key timestamp
: 为键key
设置过期时间戳(Unix 时间戳)。PEXPIREAT key milliseconds-timestamp
: 为键key
设置过期时间戳(毫秒级 Unix 时间戳)。TTL key
: 返回键key
的剩余生存时间(秒)。PTTL key
: 返回键key
的剩余生存时间(毫秒)。PERSIST key
: 移除键key
的过期时间,使其永不过期。
键空间操作
RANDOMKEY
: 随机返回数据库中的一个键。SCAN cursor [MATCH pattern] [COUNT count]
: 增量迭代键空间。SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
: 对列表、集合或有序集合进行排序。
2:多数据库常用命令
Redis 允许在一个实例中使用多个数据库。默认情况下,Redis 使用编号为 0
的数据库。可以通过以下命令来切换不同的数据库:
SELECT index
: 切换到指定的数据库。例如,SELECT 1
会切换到编号为1
的数据库。
多数据库相关命令
FLUSHDB
: 清空当前选择的数据库。FLUSHALL
: 清空所有数据库。注意:这将清除所有数据,请谨慎使用。
示例
假设您想要设置键 mykey
的值为 hello
并将其保存在编号为 1
的数据库中,可以这样做:
redis-cli
SELECT 1
SET mykey hello
如果您想要查看编号为 1
的数据库中是否存在键 mykey
:
EXISTS mykey
如果您想要从编号为 1
的数据库中删除键 mykey
:
DEL mykey
这些命令涵盖了 Redis 中键操作的基本方面,以及如何在不同的数据库之间切换。在实际使用中,根据具体的应用场景,您可能还需要结合使用其他数据类型的命令,例如列表、集合、哈希和有序集合等。
二,Redis 持久化
1,RDB和AOF的区别
RDB(Redis Database Backup)和 AOF(Append Only File)是 Redis 提供的两种持久化机制,它们的主要区别在于如何记录数据变更以及恢复数据的方式。
-
RDB:
- RDB 会在指定的时间点创建数据集的一个快照,并将这个快照保存到一个单独的文件中。
- 当 Redis 重启时,会加载最近的 RDB 快照文件来恢复数据。
-
AOF:
- AOF 记录了所有写入操作的命令,这些命令按顺序追加到一个文件中。
- 当 Redis 重启时,会重新执行 AOF 文件中的所有命令来恢复数据。
2,RDB和AOF的优缺点
1:RDB优缺点
优点
-
高性能:
- 创建 RDB 快照文件时,Redis 仍然可以处理客户端请求,因此对性能的影响较小。
- RDB 文件的创建通常在后台进行,不会阻塞客户端操作。
-
快速恢复:
- 加载 RDB 文件的速度比重新执行 AOF 文件中的所有命令要快得多,这意味着在 Redis 重启时数据恢复速度较快。
-
占用磁盘空间小:
- RDB 文件通常比 AOF 文件小,因为它们是经过压缩的数据集,有助于节省磁盘空间。
-
备份简单:
- RDB 文件是一个单一的文件,易于备份和迁移。
缺点
-
数据丢失风险:
- 由于 RDB 是在某个时间点创建的快照,所以在快照创建之后发生的数据变更如果没有来得及创建新的快照,可能会丢失。
-
配置相对复杂:
- 需要配置多个触发条件以决定何时创建 RDB 快照,这可能导致配置变得相对复杂。
-
数据恢复不精确:
- RDB 文件只能提供快照时间点的数据状态,不能精确地恢复到故障前的状态。
2:AOF优缺点
优点
-
数据丢失少:
- 默认情况下,AOF 会尽可能频繁地记录写入操作,这样即使在系统崩溃的情况下也只会丢失最后一次写入操作之前的数据。
- 可以通过配置
appendfsync
参数来进一步减少数据丢失的风险。
-
数据完整性好:
- AOF 文件可以设置为在写入磁盘后立即 fsync,以确保数据的持久性和完整性。
-
易于恢复:
- AOF 文件中的命令可以被任何 Redis 客户端执行,便于手动恢复数据。
-
支持重写:
- AOF 文件可以定期进行重写以优化文件大小和格式,从而减少磁盘占用。
缺点
-
性能略低:
- 由于每次写入操作都会追加到 AOF 文件中,因此 AOF 会对写入性能造成一定的影响。
-
占用磁盘空间大:
- AOF 文件通常比 RDB 文件大,因为它们包含了所有写入操作的历史记录。
-
AOF 重写机制:
- 虽然 AOF 重写可以帮助减少文件大小,但是这个过程本身也会消耗资源。
3,Redis持久化配置
1:RDB持久化配置
RDB 的配置主要涉及如何以及何时创建 RDB 快照文件。以下是一些重要的 RDB 相关配置项:
save
: 设置创建 RDB 快照的条件。例如save 900 1
表示如果在 15 分钟内至少有一个键被修改,则保存一次快照;save 300 10
表示如果在 5 分钟内至少有 10 个键被修改,则保存一次快照。dbfilename
: 指定 RDB 文件的名称,默认为dump.rdb
。dir
: 指定 RDB 文件的保存目录,默认为/var/lib/redis/
。rdbcompression
: 设置 RDB 文件是否使用压缩,默认为yes
。rdbchecksum
: 设置是否计算 RDB 文件的校验和,默认为yes
。
2:AOF持久化配置
AOF 的配置涉及到如何记录和处理写入操作。以下是一些重要的 AOF 相关配置项:
appendonly
: 开启或关闭 AOF 持久化,默认为no
。appendfilename
: 指定 AOF 文件的名称,默认为appendonly.aof
。dir
: 指定 AOF 文件的保存目录,默认为/var/lib/redis/
。appendfsync
: 控制写入数据到 AOF 文件的同步频率。可以选择always
(每次写入后同步)、everysec
(每秒同步一次)、no
(从不主动同步,由操作系统决定)。默认为everysec
。no-appendfsync-on-rewrite
: 当 AOF 重写正在进行时,是否禁用appendfsync
。默认为no
。auto-aof-rewrite-min-size
: 设置自动 AOF 重写的最小文件大小,默认为 64MB。auto-aof-rewrite-percentage
: 设置当 AOF 文件大小超过原始大小的百分比时触发自动重写,默认为 100%。
4,AOF重写
AOF 重写是一种优化机制,它可以减少 AOF 文件的大小,同时保持所有的数据不变。AOF 重写的过程如下:
- Redis 在后台创建一个新的 AOF 文件,其中包含了所有当前数据库的状态。
- 新的 AOF 文件只包含必要的写入操作,移除了冗余和重复的命令。
- 一旦新文件创建完成,Redis 会用新的 AOF 文件替换旧的 AOF 文件。
AOF 重写命令
BGREWRITEAOF
: 触发 AOF 重写操作。这个命令是在后台异步执行的,不会阻塞客户端请求。
自动 AOF 重写
Redis 会自动触发 AOF 重写,如果 AOF 文件大小超过 auto-aof-rewrite-min-size
并且比原始大小大 auto-aof-rewrite-percentage
%。例如,如果 auto-aof-rewrite-min-size
设为 64MB,auto-aof-rewrite-percentage
设为 100%,那么当 AOF 文件大小超过 64MB 并且比原始大小翻倍时,Redis 会自动触发 AOF 重写。
配置示例
RDB 持久化配置示例
在 redis.conf
文件中,您可以设置以下配置项来启用 RDB 持久化:
# RDB 相关配置
save 900 1 # 如果在 15 分钟内至少有一个键被修改,则保存一次快照
save 300 10 # 如果在 5 分钟内至少有 10 个键被修改,则保存一次快照
save 60 10000 # 如果在 1 分钟内至少有 10000 个键被修改,则保存一次快照
dbfilename dump.rdb # RDB 文件的名称
dir /var/lib/redis/ # RDB 文件的保存目录
rdbcompression yes # 启用 RDB 文件压缩
rdbchecksum yes # 启用 RDB 文件校验和
AOF 持久化配置示例
同样,在 redis.conf
文件中,您可以设置以下配置项来启用 AOF 持久化:
# AOF 相关配置
appendonly yes # 开启 AOF 持久化
appendfilename appendonly.aof # AOF 文件的名称
dir /var/lib/redis/ # AOF 文件的保存目录
appendfsync everysec # 控制写入数据到 AOF 文件的同步频率
no-appendfsync-on-rewrite no # 当 AOF 重写正在进行时,是否禁用 appendfsync
auto-aof-rewrite-min-size 64mb # 自动 AOF 重写的最小文件大小
auto-aof-rewrite-percentage 100 # 当 AOF 文件大小超过原始大小的百分比时触发自动重写
三,性等管理
1,内存碎片率
内存碎片率是指 Redis 使用的内存与实际分配给 Redis 的物理内存之间的比率。这个比率反映了 Redis 内存管理效率的情况。在 Redis 中,内存碎片率可以通过 INFO memory
命令查看。
如何查看内存碎片率
可以通过 INFO memory
命令查看内存碎片率。例如:
redis-cli
INFO memory
在返回的信息中,您可以找到 used_memory_rss
和 used_memory
这两个指标,它们分别表示 Redis 使用的物理内存大小(RSS,Resident Set Size)和 Redis 管理的实际数据大小。
used_memory
: Redis 管理的数据大小,不包括 Redis 本身的开销。used_memory_rss
: Redis 使用的物理内存大小,包括 Redis 本身和其他开销。
内存碎片率的计算公式如下:
内存碎片率 = used_memory_rss / used_memory
解释
- 如果内存碎片率接近 1,则表示 Redis 使用内存较为高效。
- 如果内存碎片率远大于 1,则表示 Redis 使用了大量的额外内存,可能存在内存浪费。
2,内存使用率
内存使用率是指 Redis 实际使用的内存占总分配内存的比例。Redis 中并没有直接提供内存使用率的度量,但您可以根据 INFO memory
命令提供的信息自行计算。
计算内存使用率
内存使用率可以通过以下公式计算:
内存使用率 = (used_memory + additional_memory_usage) / total_allocated_memory
其中:
used_memory
: Redis 管理的数据大小。additional_memory_usage
: Redis 本身的开销以及其他内存使用,例如缓存、数据结构开销等。total_allocated_memory
: Redis 总共分配的内存。
在 INFO memory
输出中,您可以看到 used_memory
和 used_memory_peak
等信息,这些可以帮助您计算内存使用率。
3,回收key
在 Redis 中,当内存不足时,可以通过配置不同的策略来释放内存,即回收 key。Redis 提供了几种不同的 key 回收策略,可以通过 maxmemory-policy
配置项来设置。
配置 maxmemory-policy
在 redis.conf
文件中,可以通过以下配置项来设置 key 回收策略:
maxmemory-policy volatile-lru
这里有几个可用的策略:
volatile-lru
: 从设置了过期时间的 key 中,按照最近最少使用的顺序回收。volatile-random
: 从设置了过期时间的 key 中随机回收。volatile-ttl
: 从设置了过期时间的 key 中,按照最近过期的顺序回收。allkeys-lru
: 从所有 key 中,按照最近最少使用的顺序回收。allkeys-random
: 从所有 key 中随机回收。noeviction
: 不主动回收 key,而是返回错误给客户端当内存不足时。
示例配置
假设您希望使用 volatile-lru
策略,可以在 redis.conf
中添加以下配置:
maxmemory 100mb # 设置 Redis 实例的最大内存限制
maxmemory-policy volatile-lru # 设置 key 回收策略
总结
- 内存碎片率 反映了 Redis 使用内存的效率。
- 内存使用率 描述了 Redis 实际使用的内存占总分配内存的比例。
- 回收 key 是指当 Redis 内存不足时,根据设定的策略释放内存的方法。