前言
作为Redis的使用者,你是否遇到过在Redis上执行相同命令,为什么有时候响应快,有时候却很慢?为什么Redis突然慢了一段时候之后又恢复正常了?为什么Redis执行SET、DEL命令会很耗时?为什么Redis一直运行稳定,突然从某个时段开始变慢?那么接下来就来分享一下。
Redis是什么?
Redis其实是一个开源的使用ANSI C语言编写的、支持网络的、可以基于内存或者持久化的日执行的Key-Value存储系统,即远程字典服务。Redis支持存储的类型包括字符串、链表、集合等,它支持主从同步,可执行单层树复制,可以提供多种语言的API。
Redis是一种开源的内存数据结构存储系统,可以用作缓存服务器,支持高并发、高性能、高可用性的数据存储和访问,它主要用于解决高并发、高吞吐量、低延迟的数据访问问题。
难道Redis真的变慢了?
在确定Redis真的变慢之前,首先需要知道Redis是否真的是变慢了?如果发现业务服务API在响应的时候延迟变长,那就要排查具体是服务中哪个环节让整个服务变慢。
一般情况下,比较有效的排查操作就是在服务内部集成链路追踪的方式,也可以通过打印服务日志也可以,核心点就是在服务访问外部依赖的出入口的地方,记录每一次请求外部依赖的响应延时情况。
当你发现在操作Redis的这条链路上耗时过长,那么就要注意了,应该把重心放在业务服务到Redis这条链路上面。通常,Redis变慢的原因有网络存在问题,这关系到网络质量、传输时候的延迟丢包等。
针对Redis变慢的性能优化
1、可以使用其他高效命令代替,比如需要返回一个 SET 中的所有成员的时候,不使用 SMEMBERS 命令,而是使用 SSCAN 多次迭代返回,避免一次返回大量数据造成线程阻塞。
2、当需要执行排序、交集、并集等操作的时候,可以直接在客户端完成,不要使用 SORT、SUNION、SINTER 等这些命令操作,为了避免拖慢 Redis 实例。
3、当一批 key 同时过期的时候,可以在 EXPIREAT 和 EXPIRE 的过期时间参数上加上一个指定大小范围内的随机数,进而避免拖慢 Redis 实例。
4、在获取整个实例的所有key,可以直接使用SCAN命令代替,在客户端通过执行SCAN $cursor COUNT count的命令可以得到一批key,以及下一个游标cursor,接着把该cursor当作SCAN的参数,再次执行,反复操作,直到返回的cursor为0的时候为止,这就把整个实例中的所有key遍历出来。
在ECS上部署Redis能做的事情
在ECS上部署Redis,主要是用来缓存常用数据,为的是减轻后台数据库的访问请求压力,从而提高数据访问的响应效率;在ECS上部署Redis还用来存储短期数据,比如使用手机号验证码的验证码存储,该数据无需长期保存,但是需要快速读写访问的操作。
另外,在ECS上部署Redis主要用于多种用途的场景,包涵缓存、消息队列、分布式锁等方面。
最后
综上所述,Redis变慢的原因和CPU、内存、网络、磁盘都息息相关,在任何一处发生问题,都会影响到Redis的反应速度和性能。所以作为业务开发人员,需要了解Redis基本的运行原理,使用合理的命令、规避bigke问题和集中过期问题;在运维层面需要DBA提前规划好部署策略,预留足够的资源,同时做好监控,这样当发生问题时,能够及时发现并尽快处理。最后,还是要根据实际情况来处理对应的Redis变慢的原因,具体情况,具体排查,具体处理。