性能优化
最后更新于: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 集群`
';