Redis 基础课四:性能优化和持久化策略

Redis 性能优化

  1. Redis提供了慢查询分析,针对处理时间超过配置文件中 slowlog-log-lower-than 和 slowlog-max-len 的阈值进行统计,建议值是1ms 和 1000 以上;

  2. 可以通过命令 slowlog get [n],slowlog len,slowlog reset 来获取慢查询的语句,慢查询语句数量和重置这些配置,需要注意一段时间可以将慢查询的记录进行持久化,否则会丢失;

  3. 另一个性能优化的关注点,是 bigkey,其占用内存大,操作耗时,容易阻塞 redis,且如果是热点 key,危害更大,因此需要提前通过 debug object key 发现,主动监测(scan + debug)和被动查找(有异常后),通过命令 redis-cli --bigkeys 来获取;

  4. 需要对危险的命令进行重写,如 keys, flushall,shutdown 等;

  5. 删除命令,如果是字符串类型,可以直接 del,如果是其他类型,建议使用 scan + del,避免误删;

  6. 还有一些命令来测试性能,如,redis-cli --latency 来测试 redis 客户端到目标 redis 的延迟,redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000 -t get(50 个并发,10000 个连接,-t 表示要测试的命令)来对 redis 进行压测;

Redis 持久化

  1. Redis 持久化有两种方案,周期性快照 RDB 和 操作记录保存 AOF,Redis 重启时,会根据这些文件来恢复数据;

  2. RDB 方式,是定时将 redis 数据快照到磁盘上,特点是恢复速度快,但生成耗时且可能造成数据丢失,AOF 是将 redis 修改,新增命令持久化到磁盘,推荐使用;

  3. Redis 重启时,会首先判断是否开启了 aof,查找 aof 文件,存在则加载,如果没有开启 aof,或者不存在 aof 文件,就会去加载 rdb 文件,如果两者都不存在,就不好恢复任何数据;

  4. 建议 Redis 单实例控制在 10G 内存以内,命令 bgsave 和 bgrewriteaof 都会创建 fork 线程,创建过程是阻塞的,对于高 qps 是无法忽略的,并且 fork 时间,与内存量成正比,注意考虑这部分内存的冗余;

RDB方式

  1. Rdb 持久化,有手动触发和自动触发,手动触发通过命令 save 或者 bgsave,save 是 redis 主线程阻塞来生成 rdb 文件,而 bgsave 是创建子线程,使用子线程生成 rdb 文件,所以主线程只会阻塞创建线程这个阶段。自动触发是在配置文件中设置 save m n,表示如果在 m 秒内出现 n 次修改,就触发 bgsave;

  2. 这种方式的缺点是,可能丢失部分数据,如果配置是 save 900 30,那么在 900 秒内还没达到 30 次修改时,redis宕机了,那么就会丢失上一次快照到宕机时的修改了;

  3. 第一次主从复制,从节点会全量复制主节点数据,就会触发主节点执行 bgsave 生成 rdb 文件,然后发送给从节点;

  4. redis-check-dump 可以检测 rdb 文件的正确性;

AOF方式

  1. AOF持久化,也有手动触发和自动触发,手动触发通过 bgrewriteaof,自动触发,通过配置文件中 appendoly yes 来开启;

  2. appendfsync 的同步策略有 always,everysec 和 no ,always 表示写命令后立即同步,everysec 表示每秒钟进行一次同步,no 是同步间隔时间由操作系统决定,建议使用 everysec,这种方式最多会丢失 2s 的数据,综合性能和数据丢失;

  3. AOF 是持久化每次修改命令,并定期重写 AOF 持久化文件,压缩 aof 文件大小,恢复数据时,只需要重新执行这些命令,推荐使用,另外 AOF 重写,也是通过创建子线程执行,只会阻塞创建线程这个阶段;

  4. redis-check-aof-fix 可以修复错误的 aof 文件;

操作建议

  1. 建议执行一些耗时的命令,可以在不对外的 redis 从节点进行;

  2. set key 会清除之前相同 key 的过期时间;

  3. could not get a resource,可能连接未归还,也可能慢查询导致连接释放慢,通常连接池只需要比默认最大连接数(8)大一点;

  4. 读写超时,可能是,读写超时设置太短,慢查询,网络原因,redis 发生阻塞;连接超时,可能是,连接超时设置太短,redis 发生阻塞,网络原因,lua 脚本执行超时,超过了 lua-time-limit,需要执行 script kill;

  5. 缓冲区异常,unexpected end of stream,可能是输出缓冲区满,如,redis 客户端设置输出缓冲区为 1M,那么当获取一个bigkey,3M 时就会出现这个异常;

你可能感兴趣的:(Redis,redis,java,数据库)