替你踩过Redis缓存的坑,奉上使用规范和监控方法( 三 )
推荐使用O(1)命令 , 如get scard等 。
O(N)命令关注N的数量 , 如下命令需要对N值在业务层面做控制 。
- hgetall
- lrange
- smembers
- zrange
5、Pipeline使用
说明:Pipeline是Redis批量提交的一种方式,也就是把多个命令操作建立一次连接发给Redis去执行,会比循环的单次提交性能更优 。
Redis客户端执行一条命令分4个过程:发送命令 -> 命令排队 ->命令执行 -> 返回结果 。
文章插图
常用的mget、mset命令 , 有效节约RTT(命令执行往返时间) , 但hgetall并没有mhgetall , 是不支持批量操作的 。 此时 , 需要使用Pipeline命令
文章插图
例如:直播中台项目中 , 需要同时查询主播日、周、月排行榜 , 使用PIPELINE一次提交多个命令 , 同时返回三个榜单数据 。
6、线上禁用命令
- 禁止使用Monitor
禁止生产环境使用monitor命令 , monitor命令在高并发条件下 , 会存在内存暴增和影响Redis性能的隐患
- 禁止使用Keys
keys操作是遍历所有的key , 如果key非常多的情况下导致慢查询 , 会阻塞其他命令 。 所以禁止使用keys及keys pattern命令 。
建议线上使用scan命令代替keys命令 。
- 禁止使用Flushall、Flushdb
删除Redis中所有数据库中的所有记录 , 并且该命令是原子性的 , 不会终止执行 , 一旦执行 , 将不会执行失败 。
- 禁止使用Save
阻塞当前redis服务器 , 直到持久化操作完成为止 , 对于内存较大的实例会造成长时间的阻塞
- BGREWRITEAOF
手动AOF , 手动持久化对于内存较大的实例会造成长时间的阻塞
- Config
Config是客户端配置方式 , 不利于Redis运维 。 建议在Redis配置文件中设置 。
1、慢查询
方法一:slowlog获取慢查询日志
127.0.0.1:{port}> slowlog get 5
1) 1) (integer) 47
2) (integer) 1533810300
3) (integer) 175833
4) 1) "DEL"
2) "spring:session:expirations:1533810300000"2) 1) (integer) 46
2) (integer) 1533810300
3) (integer) 117400
4) 1) "SMEMBERS"
方法二:更全面的慢查询可以通过CacheCloud工具监控 。
路径:"应用列表"-点击相关应用名-点击"慢查询"Tab页 。
点击"慢查询" , 重点关注慢查询个数及相关命令 。
2、监控Redis实例绑定的CPU核心使用率
由于Redis是单线程 , 重点监控Redis实例绑定的CPU核心使用率 。
一般CPU资源使用率为10%左右 , 如果使用率高于20%时 , 考虑是否使用了RDB持久化 。
3、Redis分片负载均衡
当前redis-cluster架构模式 , 3个master和3个Slave组成的集群 , 关注 Redis-cluster每个分片requests流量均衡情况;
通过命令获取:
redis-cli -p{port} -h{host} --stat
一般情况 , 超过12W需要告警 。
4、关注大key BigKey
通过Redis提供的工具 , redis-cli定时扫描相应Redis大Key , 进行优化 。
具体命令如下:
redis-cli -h 127.0.0.1 -p {port} --bigkeys或
redis-memory-for-key -s {IP} -p {port} XXX_KEY一般超过10K为大key , 需要重点关注 , 建议从业务层面优化 。
5、监控Redis占用内存大小
Info memory 命令查看 , 避免在高并发场景下 , 由于分配的MaxMemory被耗尽 , 带来的性能问题 。
重点关注 used_memory_human 配置项对应的value值 , 增量过高时 , 需要重点评估 。
七、总结
结合具体业务特性 , 合理评估Redis所需内存容量、选择数据类型、设置单key大小 , 才能更好地服务于业务 , 为业务提供高性能的保障 。
作者丨Jessica Chen
来源丨vivo互联网技术(ID:vivoVMIC)
dbaplus社群欢迎广大技术人员投稿 , 投稿邮箱:editor@dbaplus.cn
- 用户|自称百度旗下平台,收集用户信息,为资金盘倒流,这个坑你踩过吗?
- 3天时间,我是如何解决redis bigkey 删除问题的?
- Django实战016:django中使用redis详解
- 你不知道的Redis:入门?数据结构?常用指令?
- Python操作Redis大全
- 为什么 Redis 单线程能支撑高并发?
- Martian框架发布 3.0.3 版本,Redis分布式锁
- redis 数据类型详解 以及 redis适用场景场合
- Redis流行的原因
- Redis源码剖析之快速列表(quicklist)