性能优化

最后更新于:2022-04-02 04:00:41

[TOC] > [参考](https://mp.weixin.qq.com/s/JVTtowoqsIixiaK8WL7wgQ?utm_source=tuicool&utm_medium=referral) ## 概述 1. 缩短键值对的存储长度; 2. 使用 lazy free(延迟删除)特性; 3. 设置键值的过期时间; 4. 禁用长耗时的查询命令; 5. 使用 slowlog 优化耗时命令; 6. 使用 Pipeline 批量操作数据; 7. 避免大量数据同时失效; 8. 客户端使用优化; 9. 限制 Redis 内存大小; 10. 使用物理机而非虚拟机安装 Redis 服务; 11. 检查数据持久化策略; 12. 禁用 THP 特性; ### lazy free lazy free 特性是 Redis 4.0 新增的一个非常使用的功能,它可以理解为惰性删除或延迟删除,在删除的时候提供异步延时释放键值的功能 ``` lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no slave-lazy-flush no ``` * lazyfree-lazy-eviction:表示当 Redis 运行内存超过 maxmeory 时,是否开启 lazy free 机制删除; * lazyfree-lazy-expire:表示设置了过期时间的键值,当过期之后是否开启 lazy free 机制删除; * lazyfree-lazy-server-del:有些指令在处理已存在的键时,会带有一个隐式的 del 键的操作,比如 rename 命令,当目标键已存在,Redis 会先删除目标键,如果这些目标键是一个 big key,就会造成阻塞删除的问题,此配置表示在这种场景中是否开启 lazy free 机制删除; * slave-lazy-flush:针对 slave(从节点) 进行全量数据同步,slave 在加载 master 的 RDB 文件前,会运行 flushall 来清理自己的数据,它表示此时是否开启 lazy free 机制删除。 建议开启 1,2,3 的配置 ### 禁用长耗时的查询命令 * 决定禁止使用 keys 命令; * 避免一次查询所有的成员,要使用 scan 命令进行分批的,游标式的遍历; * 通过机制严格控制 Hash、Set、Sorted Set 等结构的数据大小; * 将排序、并集、交集等操作放在客户端执行,以减少 Redis 服务器运行压力; * 删除 (del) 一个大数据的时候,可能会需要很长时间,所以建议用异步删除的方式 unlink,它会启动一个新的线程来删除目标数据,而不阻塞 Redis 的主线程。 ### 使用 slowlog 优化耗时命令 在`redis.conf`中 * `slowlog-log-slower-than` :用于设置慢查询的评定时间,也就是说超过此配置项的命令,将会被当成慢操作记录在慢查询日志中,它执行单位是微秒 (1 秒等于 1000000 微秒); * `slowlog-max-len` :用来配置慢查询日志的最大记录数。 通过 `slowlog get n` 获取慢查询日志的条数 ### 限制 Redis 内存大小 在 64 位操作系统中 Redis 的内存大小是没有限制的,也就是配置项 `maxmemory ` 是被注释掉的,这样就会导致在物理内存不足时,使用 swap 空间既交换空间,而当操心系统将 Redis 所用的内存分页移至 swap 空间时,将会阻塞 Redis 进程 ### 检查数据持久化策略 在 Redis 4.0 之后,Redis 有 3 种持久化的方式: * RDB(Redis DataBase,快照方式)将某一个时刻的内存数据,以二进制的方式写入磁盘; * AOF(Append Only File,文件追加方式),记录所有的操作命令,并以文本的形式追加到文件中; * 混合持久化方式,Redis 4.0 之后新增的方式,混合持久化是结合了 RDB 和 AOF 的优点,在写入的时候,先把当前的数据以 RDB 的形式写入文件的开头,再将后续的操作命令以 AOF 的格式存入文件,这样既能保证 Redis 重启时的速度,又能减低数据丢失的风险。 建议开启混合模式 查询是否开启混合持久化可以使用 `config get aof-use-rdb-preamble` 命令 开启 1. 命令行开启 `config set aof-use-rdb-preamble yes` 2. 通过修改 Redis 配置文件开启 `aof-use-rdb-preamble no -> aof-use-rdb-preamble yes` ### 使用分布式架构来增加读写速度 * 主从同步 * 哨兵模式 * Redis Cluster 集群 推荐 使用 `Redis Cluster 集群`
';