tcp_nodelay
、tcp_keepalive
等)以减少网络延迟和带宽消耗。在 Linux 系统上,可以在 /etc/sysctl.conf
中进行配置,例如:net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 2048
操作系统的配置对 Redis 的性能影响显著。通过合理配置操作系统,可以充分发挥硬件性能,提升 Redis 的处理能力。
redis.conf
中启用内存锁定:maxmemory-policy noeviction
vm.swappiness = 1
),防止 Redis 被交换到磁盘。在 /etc/sysctl.conf
中配置:vm.swappiness = 1
ext4
或 xfs
文件系统。ext4
是 Linux 默认文件系统,性能稳定;xfs
在处理大文件写入时性能更好,适合 AOF 持久化场景。Too many open files
错误。编辑 /etc/security/limits.conf
:* soft nofile 65536
* hard nofile 65536
vm.max_map_count
参数以支持更大的内存映射,减少 OOM(Out of Memory)错误:vm.max_map_count = 262144
在 /etc/sysctl.conf
中设置后运行 sysctl -p
使配置生效。
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
Redis 配置优化直接影响 Redis 的性能表现。合理配置 Redis 参数,可以提高读写效率,减少阻塞和瓶颈。
volatile-lru
、allkeys-lru
、volatile-random
、allkeys-random
等。一般情况下,使用allkeys-lru
可以在内存不足时优先淘汰最近最少使用的键。MEMORY PURGE
命令主动清理内存碎片。appendfsync
参数决定 AOF 的刷盘策略:
always
:每次写操作后都同步刷盘,数据安全性高但性能最差。everysec
:每秒刷盘一次,性能与安全性平衡。no
:操作系统自行决定刷盘时间,性能最好但数据丢失风险高。redis.conf
中调整 save
参数,例如:save 900 1
save 300 10
save 60 10000
maxclients
参数以支持更多的并发连接数。可以在 redis.conf
中设置:maxclients 10000
repl-diskless-sync
选项为 yes
可以减少同步过程中的磁盘 I/O 操作,提升复制性能。INCR
、DECR
等命令进行高效的原子操作。LPUSH
、RPUSH
、LPOP
、RPOP
等命令实现先进先出(FIFO)或先进后出(LIFO)的队列操作。Redis 的 Hash 适合存储多个字段的对象,当字段较少且值较短时,使用 Hash 可以显著减少内存占用。Redis 会将小型 Hash 以 ziplist(压缩列表)的形式存储,这样可以减少内存占用。
hash-max-ziplist-entries
和 hash-max-ziplist-value
参数,增大它们的值,确保更多的 Hash 以压缩列表的形式存储。例如:
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
对于小型的 List 和 Set,Redis 可以使用 ziplist(压缩列表)和 intset(整数集合)来节省内存。压缩列表是一种更紧凑的存储格式,可以有效减少内存占用。
list-max-ziplist-entries
和 list-max-ziplist-value
参数,增大它们的值,使更多的 List 以压缩列表的形式存储。例如:list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries
参数,确保更多的 Set 使用整数集合存储。使用 Sorted Set 的压缩格式:对于小型的 Sorted Set,可以使用 ziplist 来存储,减少内存占用。调整 zset-max-ziplist-entries
和 zset-max-ziplist-value
参数。例如:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
毕竟是内存,金贵
使用更紧凑的字符串编码: Redis 会自动选择适当的字符串编码方式(raw 或 int 编码)。如果某些字符串可以转换为整数,Redis 会使用更紧凑的 int 编码来存储它们。例如,字符串 "12345"
可以转换为整数 12345
,Redis 会选择整数编码,减少内存使用
使用 LZF 压缩 AOF 文件: 如果启用了 AOF(Append Only File)持久化,可以选择使用 LZF 压缩 AOF 文件,减少磁盘和内存的使用。
在 redis.conf
中启用 AOF 压缩:
aof-use-rdb-preamble yes
gzip
或 snappy
等压缩算法。压缩后的数据可以存储为二进制格式(如字符串),这样可以在保持数据不变的情况下显著减少内存占用。在写入数据之前对数据进行压缩,读取数据时进行解压缩。优化内存分配: Redis 内部使用 jemalloc 作为内存分配器,可以通过定期优化和整理内存分配来减少内存碎片
执行内存碎片整理:使用 MEMORY PURGE
命令主动清理未使用的内存,减少内存碎片。例如:
MEMORY PURGE
jemalloc
的垃圾回收频率、碎片合并策略等参数。EXPIRE
命令为键设置合理的过期时间,定期清理无用数据,释放内存。TTL
命令和 Keyspace Notifications,可以监控键的过期情况,及时清理和回收内存。● 合并重复的数据:对于存储结构相似或内容重复的数据,可以考虑使用更高效的存储方式来减少内存占用。例如,使用共享字符串(String Interning)或引用计数技术,避免冗余数据存储
● 使用 HyperLogLog 和 Bitmap:对于某些数据统计场景,可以使用 HyperLogLog 和 Bitmap 数据结构来替代传统的 Set 或 List 存储方式。这些数据结构具有更低的内存占用,可以在一定范围内提高数据存储的紧凑性。
○ HyperLogLog:适用于大规模去重计数的场景,例如 UV 统计。它使用概率算法,在牺牲部分精度的情况下,可以大幅减少内存使用。
○ Bitmap:适用于布尔值存储和二进制数据处理,例如位图索引、状态标记等场景
写入性能是 Redis 性能优化的一个重要方面。通过优化写入策略,可以显著提高 Redis 的吞吐量和响应时间。
优化查询性能是 Redis 性能优化的另一个关键环节。通过合理的查询策略和命令选择,可以显著提高 Redis 的查询效率。
MGET
、MSET
等),减少网络往返次数,提高查询性能。EXPIRE
、TTL
等命令设置和查询键的过期时间。SORT
、ZRANGE
等),减少CPU和内存开销。例如,使用HASH
存储对象属性而不是用STRING
存储 JSON 文本。MEMORY PURGE
命令释放空闲内存,减少内存碎片,提高查询性能。可以使用 Redis 的 INFO 命令监控内存使用情况和碎片率,定期进行优化redis-cli
、INFO
命令、SLOWLOG
等)监控 Redis 的性能和健康状态。也可以集成第三方监控工具(如 Prometheus、Grafana)进行更全面的监控。maxmemory
、maxclients
、timeout
等参数,优化系统性能。SLOWLOG
记录慢查询日志,分析和优化慢查询,减少查询延迟,提高查询性能。可以设置合理的慢查询阈值,监控和优化查询性能瓶颈。大家在redis实例优化和schema设计优化有什么想法,欢迎评论