第3课redis_内存优化_持久化_线程
热度🔥:31 免费课程
授课语音
Redis 性能优化
1. 介绍
Redis 是一个用 C 语言开发的高性能内存数据库,其内存管理和优化对于保持性能和稳定性至关重要。
内存使用:
- 数据存储:用于存储各种数据结构,如字符串、集合、哈希、有序集合、列表和流等。
- 内存碎片:内存分配和释放过程中产生的碎片,影响内存使用效率。
- 内存元数据:用于管理和索引数据结构所需的额外内存。
- 内存持久化:涉及 RDB 快照(定期生成数据快照,适用于对持久化要求不高的场景)和 AOF 日志(记录每个写操作,适用于对持久化和可靠性要求高的场景)。
内存碎片 在内存中未被充分利用的空闲块,主要原因包括:
- 动态分配内存时的分配和释放过程。
- 数据结构的动态增长和收缩,Redis 在存储数据时,申请的内存空间通常大于实际存储的空间。
内存优化管理:
Redis 使用
jemalloc
作为默认的内存分配器,jemalloc
是一个高效的内存分配库,优化了多线程环境下的内存分配和释放。数据类型存储优化,Redis 根据数据的大小和类型选择最合适的编码方式,并采用压缩选项来减少内存占用:
- 字符串:使用不同的编码方式,如
raw
(存储较小文本,不压缩)、int
(存储整数)、emstr
(数据与元数据一起存储)。 - 哈希:小哈希使用压缩编码,大哈希使用普通编码。
- 列表:小列表使用
ziplist
压缩编码,大列表使用linkedlist
编码。 - 集合和有序集合:支持压缩编码,小数据量使用
intset
编码,大数据量使用hashtable
编码。 - 流:使用压缩编码和批量处理,提高效率。
- 字符串:使用不同的编码方式,如
内存限制和逐出策略,包括:
- 惰性删除:只有在访问键时才进行过期检查。
- 定期删除:每隔一段时间抽取一批键进行过期检查。
- 内存淘汰机制:通过配置
maxmemory
参数限制 Redis 实例的最大内存使用量,达到限制时使用相应的规则进行淘汰。
线程机制: Redis 的核心操作是单线程的,所有请求通过单个事件循环处理,避免了多线程环境中的锁和竞争问题,从而简化代码设计和维护成本,减少并发问题。然而,Redis 后期在特定场景中引入了多线程支持,包括:
- 多路复用机制来处理 IO 操作,虽然主线程处理请求,但底层的 IO 操作使用多路复用提高性能。
- AOF 重写在后台多线程中进行,提高系统性能。
- 多线程处理客户端缓存,减少主线程在处理缓存数据时的瓶颈。
2. 实践案例
下面的案例演示如何配置 Redis,以优化其内存使用、持久化选项和线程等设置。
Redis 内存配置
# redis.conf
# 设置 Redis 使用的最大内存为 1GB
maxmemory 1gb
# 当达到最大内存限制时,使用 volatile-lru 策略
# 只从设置了过期时间的键中选择最近最少使用的键进行删除
maxmemory-policy volatile-lru
Redis 持久化配置
Redis 支持两种主要的持久化机制:RDB(快照)和 AOF(追加文件)。可以选择使用其中一种,或同时使用两者。
# redis.conf
# RDB 持久化配置
# 每隔 900 秒(15 分钟),如果至少有 1 个键发生变化,则保存快照
save 900 1
# 每隔 300 秒(5 分钟),如果至少有 10 个键发生变化,则保存快照
save 300 10
# 每隔 60 秒(1 分钟),如果至少有 10000 个键发生变化,则保存快照
save 60 10000
# 启用 AOF 持久化
appendonly yes
# AOF 文件的同步策略:每秒同步一次
appendfsync everysec
Redis 线程配置
Redis 本身是单线程的,但在 Redis 7.0 及以后版本中,引入了 I/O 多路复用的线程支持来提高性能。
# redis.conf
# 启用 I/O 线程,线程数设置为 2,启用 I/O 线程可以提高 Redis 在高并发情况下的性能。
io-threads 2
# 允许 I/O 线程处理读操作,减少主线程的负担。
io-threads-do-reads yes
连接配置
# redis.conf
# 设置客户端连接超时时间为 0,表示没有超时
timeout 0
# 设置 TCP 后备队列的长度为 512,以处理大量连接请求
tcp-backlog 512
# 设置最大客户端连接数为 10000,限制同时连接的客户端数量,防止服务器因过多连接而过载。
maxclients 10000
安全配置
# redis.conf
# 设置 Redis 访问密码,防止未经授权的访问
requirepass your-secure-password
# 绑定到指定的 IP 地址,增加安全性(例如只允许本地访问)
bind 127.0.0.1
# 启用保护模式,防止在默认配置下被远程访问
protected-mode yes
日志配置
# redis.conf
# 设置日志级别为 notice,以记录重要的信息
loglevel notice
# 将日志写入指定的文件
logfile /var/log/redis/redis-server.log
监控配置
通过 Redis CLI 使用以下命令查看 Redis 状态和实时监控操作:
# 查看 Redis 服务器的详细信息,包括内存使用、CPU 使用等
redis-cli INFO
# 实时监控 Redis 操作
redis-cli MONITOR
通过这些配置和优化策略,我们可以显著提高 Redis 的性能和稳定性,确保在高负载情况下依然能够高效运行。希望这些内容能对大家的学习和使用有所帮助!