redis——优化

    • 键值设计
      • bigKey
      • 例子
    • 批处理
      • 单机 pipeline
      • 集群
    • 服务器
      • 持久化
      • 慢查询
      • 安全
      • 内存
    • 集群问题
      • 集群完整性
      • 集群带宽
      • 数据倾斜
      • 客户端性能
      • 命令的集群兼容性
      • lua和事务:集群下不支持

键值设计

  1. 长度 <= 44
    节省内存。string的底层数据结构中,编码格式embstr(连续空间存储),如果大于,则是非连续空间
  2. 不包含特殊字符
  3. 基本格式:[业务名称]:[数据名称]:id。
    可读性强,避免重复,便于管理

bigKey

要求

  • 集合key元素数量<1000
  • 单个key的value<10KB

问题

  • 网络阻塞:因单个key太大,少量QPS,使得带宽堵塞,其他请求无法处理
  • 数据倾斜:对key散列到各个插槽,bigkey所在的机器内存使用率大于其他机器。需要手动重新分配插槽
  • redis阻塞:运算耗时,阻塞主线程
  • cpu压力:key序列化和反序列化耗cpu

扫描

  • redis-cli --bigkeys 扫描全部key。阻塞主线程
  • scan,通过游标,部分迭代,扫描全部key

处理

  • unlink 异步删除
  • 遍历bigkey的所有元素,逐个删除,最后删除bigkey

例子

redis——优化_第1张图片
redis——优化_第2张图片
拆分成多个小的hash每个hash一部分数据
eg:原数据1-100万
现:拆为100各hash 每个1万条数据,每个之前加不同前缀
one:somekey-{field-value}
two:somekey-{field-value}

批处理

单机 pipeline

  • mxxx一次处理多个命令(不要过大,否则可能导致网络堵塞),节省网络时间。eg:mset。
  • redis内置操作,更快,将一组命令做成原子性的
  • 只能处理部分数据类型
  • pipeline 各种数据类型都可以
  • 批处理的多个key必须落在一个插槽里。不同插槽在一个连接中无法完成

集群

redis——优化_第3张图片

服务器

持久化

  • redis做缓存尽可能不开启持久化,在做分布式锁等操作时使用
  • 建议关闭RDB(丢数据),使用AOF。
    RDB适合做数据备份,可手动处理
    更改配置,避免AOF频繁rewrite,避免在rewrite中AOF。
    主线程阻塞,等待AOF结束,但rewrite产生磁盘IO,AOF阻塞,则主线程长时间阻塞
    redis——优化_第4张图片
  • 部署
    redis——优化_第5张图片

慢查询

  • 设置阈值,超过阈值时间的都为慢查询
  • 慢查询命令存储在slowlog中
    redis——优化_第6张图片

安全

redis——优化_第7张图片

内存

内存不足 key频繁被删,qps不稳定,响应时间增长
redis——优化_第8张图片
info memory 查看内存情况

  • 复制缓冲区:RDB时,有新的数据,放在此处。从节点和主节点的增量更新,在此处的offset比较
  • AOF:AOF刷盘时的新命令
  • 客户端缓冲区:redis连接的客户端,输入输出缓冲区
    输入缓冲区:1G不可变,除非redis主进程堵塞,一般不会溢出
    输出缓冲区:可设置。bigkey/带宽不够可能导致溢出,
    redis——优化_第9张图片

集群问题

集群完整性

有个别插槽不可用则认为整个集群不可用

集群带宽

多个节点之间互相ping ,同时携带集群和插槽信息
如果节点过多,携带数据会很大,使用带宽变大,导致网络堵塞

  • 避免集群过大 > 1000, 可以拆分为多个集群
  • 不要在一个实例中运行多个redis
  • 设置阈值,心跳检测超过时间认为节点下线,时间越大ping的次数越小,发现故障越完

数据倾斜

客户端性能

redis做集群,客户端需要选择节点

命令的集群兼容性

部分命令不支持集群,只能单机
集群需要使用代码完成,增加复杂度

lua和事务:集群下不支持

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