云服务器内容精选

  • 为了减少大Key和热Key过大,有什么使用建议? string类型控制在10KB以内,hash、list、set、zset元素尽量不超过5000个。 Key的命名前缀为业务缩写,禁止包含特殊字符(比如空格、换行、单双引号以及其他转义字符)。 Redis事务功能较弱,不建议过多使用。 短连接性能差,推荐使用带有连接池的客户端。 如果只是用于数据缓存,容忍数据丢失,建议关闭持久化。 大Key/热Key的优化方法,请参考下表。 类别 方法 大Key 进行大Key拆分。 分为以下几种场景: 该对象为String类型的大Key:可以尝试将对象分拆成几个Key-Value, 使用MGET或者多个GET组成的pipeline获取值,分拆单次操作的压力。如果是集群实例,由于集群实例包含多个分片,拆分后的Key会自动平摊到集群实例的多个分片上,从而降低对单个分片的影响。 该对象为集合类型的大Key,并且需要整存整取:在设计上严格禁止这种场景的出现,因为无法拆分。有效的方法是将该大Key从Redis去除,单独放到其余存储介质上。 该对象为集合类型的大Key,每次只需操作部分元素:将集合类型中的元素分拆。以Hash类型为例,可以在客户端定义一个分拆Key的数量N,每次对HGET和HSET操作的field计算哈希值并取模N,确定该field落在哪个Key上,实现上类似于Redis Cluster的计算slot的算法。 将大Key单独转移到其余存储介质。 无法拆分的大Key建议使用此方法,将不适用Redis能力的数据存至其它存储介质,如SFS或者其余NoSQL数据库,并在Redis中删除该大Key。 注意: 禁止使用DEL直接删除大Key,可能会造成Redis阻塞,甚至主备倒换。Redis 4.0及以上版本建议采用UNLINK命令删除大Key。 合理设置过期时间并对过期数据定期清理。 合理设置过期时间,避免历史数据在Redis中大量堆积。由于Redis的惰性删除策略,过期数据可能并不能及时清理,如果发现Redis过期Key清理较慢,建议配置过期Key扫描。 热Key 使用读写分离。 如果热Key主要是读流量较大,则可以在客户端配置读写分离,降低对主节点的影响。还可以增加多个副本以满足读需求,但是备机较多也有相应的影响,D CS 主备节点之间使用的是星型复制,即所有的备节点都直接和主节点保持同步,这样能保证备节点之间相互独立,且复制延迟较小。缺点是在备节点数量较多的情况下,主节点的CPU和网络负载会较高。 使用客户端缓存/本地缓存。 该方案需要提前了解业务的热点Key有哪些,设计客户端/本地和远端Redis的两级缓存架构,热点数据优先从本地缓存获取,写入时同时更新,这样能够分担热点数据的大部分读压力。缺点是需要修改客户端架构和代码,改造成本较高。 设计熔断/降级机制。 热Key极易造成缓存击穿,高峰期请求都直接透传到后端数据库上,从而导致业务雪崩。因此热Key的优化一定需要设计系统的熔断/降级机制,在发生击穿的场景下进行限流和服务降级,保护系统的可用性。 父主题: 大Key/热Key分析/过期Key扫描
  • 什么是大Key/热Key? 名词 定义 大Key 大Key可以分为两种情况: Key的Value占用存储空间较大。一般单个String类型的Key大小达到10KB,或者集合类型的Key总大小达到50MB,则被定义为大Key。 Key的元素较多。一般集合类型的Key中元素超过5000个,则被定义为大Key。 热Key 通常当一个Key的访问频率或资源占用显著高于其他Key时,则称之为热Key。例如: 某个集群实例一个分片每秒处理10000次请求,其中有3000次都是操作同一个Key。 某个集群实例一个分片的总带宽使用(入带宽+出带宽)为100Mbits/s,其中80Mbits是由于对某个Hash类型的Key执行HGETALL所占用。 父主题: 大Key/热Key分析/过期Key扫描
  • 如何分析Redis 3.0实例的热Key? 由于Redis 3.0本身不提供热Key能力,您可以参考以下方法进行分析。 方法1:进行业务结构和业务实现分析,找到可能的热Key。 例如,某商品在秒杀,或者用户登录,对业务代码分析,很容易找到热Key。 优点:简单易行。 缺点:需要对业务代码比较了解,另外对于一些复杂的业务场景,不太容易分析。 方法2:在客户端代码中,调用Redis的函数中,进行访问Key的记录,进而统计出热Key。 缺点:需要代码进行侵入式修改。 方法3:抓包分析。 优点:简单易行。 父主题: 大Key/热Key分析/过期Key扫描
  • 过期key删除机制 惰性删除:Redis的删除策略由主循环中的判断逻辑进行控制,所有Key读写命令执行之前都会调用函数对其进行检查,如果过期,则删除该键,然后返回Key不存在的结果;未过期则不做操作,继续执行原有的命令。 定期删除:由Redis的定时任务函数实现,该函数以一定的频率运行,每次运行时,都从键空间中取出一定数量的随机Key进行检查,并删除其中的过期键。 不是每次定时任务都会检查所有的Key,而是随机检查一定数量的Key,该机制旨在防止阻塞Redis主进程太久而造成业务阻塞,所以会造成已过期的Key释放内存速度较慢。