云服务器内容精选

  • 背景说明 在开源Redis的键空间中,有两种删除Key的方式。 使用DEL等命令直接显式对Key进行删除。 使用类似于EXPIRE等命令对Key设置过期时间,当达到过期时间时,Redis键空间中的Key将不可访问。对于设置了过期时间的Key,当达到过期时间时,Redis不会立即对Key进行删除,由于Redis当前主线程仍然为单线程,故Redis设计了几种机制对已经过期的Key进行内存释放: 惰性删除:Redis的删除策略由主循环中的判断逻辑进行控制,所有Key读写命令执行之前都会调用函数对其进行检查,如果过期,则删除该键,然后返回Key不存在的结果;未过期则不做操作,继续执行原有的命令。 定期删除:由Redis的定时任务函数实现,该函数以一定的频率运行,每次运行时,都从键空间中随机取出一定数量的Key进行检查,并删除其中的过期键。(默认一次从设置过期时间的Key中随机检查20个,每秒10次) 不是每次定时任务都会检查所有的Key,而是随机检查一定数量的Key,该机制旨在防止阻塞Redis主进程太久而造成业务阻塞,所以会造成已过期的Key释放内存速度较慢。
  • 自动扫描参数配置 在执行过期key扫描时,若您想设置自动扫描,单击“自动扫描”右侧的,弹出“自动扫描设置”页面,进行相应设置后,单击“确定”自动扫描配置完成。 自动扫描配置参数说明如下表1。 表1 自动扫描配置参数 配置参数 参数含义 取值范围 默认值 备注 首次扫描时间 设定的第一次扫描时间,须设定在当前时间之后。 取值格式:YYYY/MM/DD hh:mm:ss - - 扫描间隔 从首次扫描时间开始,每隔一个间隔时间,便启动一次扫描。 0~43,200,单位:分 1440 如果到达启动时刻,上一次扫描还未结束,则本次轮空。 启动扫描的时机有五分钟冗余量,即超过本次启动时刻,不足五分钟,仍然会启动,不至于轮空。 说明: 连续扫描可能使cpu占用率较高,建议根据实例中key总量以及key增长情况来配置,可参考下面性能说明和配置建议。 扫描超时 此参数的目的在于避免不可知原因造成的扫描超时,导致后面的定时任务无法执行。设定此参数,超过超时时间后,返回失败,以便能继续进行下一轮扫描。 1~86,400,单位:分 2880 时间不少于扫描间隔时间的2倍。 可根据每次过期key扫描的时间,以及使用场景所能承受的最大超时时间,设定一个经验值。 迭代扫描key数量 SCAN命令用于迭代当前数据库中的key集合。 COUNT选项的作用就是让用户告知迭代命令, 在每次迭代中应该从数据集里返回多少元素。具体参见scan命令介绍。迭代式扫描可降低一次扫描过多key而造成扫描时间过长,影响redis性能的问题。 10~1,000,单位:个 10 举例:redis中有1000万个key,迭代扫描key数量设为1000,则迭代10000次可完成全库扫描。 性能说明: 数据面底层SCAN扫描间隔5ms,相当于1秒钟扫描200次。迭代扫描key数量设为10/50/100/1000时,每秒钟扫描2000/10000/20000/200000个key。 每秒钟扫描key数量越大,cpu占用率也相应增加。 测试参考: 使用主备实例测试,在有1000万不过期和500万过期的key,过期时间为1-10秒的场景下,完成一次全库扫描,测试数据如下: 以下测试结果仅供参考,不同局点环境和网络波动等客观条件可能产生差异。 自然删除,每秒删除1万条过期key,删除500万过期key,耗时约为8分钟,cpu占用率约为5%。 “迭代扫描key数量”设为10,耗时约为 1500万/0.2万/60秒 = 125分,cpu占用率约为8%。 “迭代扫描key数量”设为50,耗时约为 1500万/1万/60秒 = 25分, 删除key时cpu占用率约10%。 “迭代扫描key数量”设为100,耗时约为 1500万/2万/60秒 = 12.5分, 删除key时cpu占用率约20%。 “迭代扫描key数量”设为1000,耗时约为 1500万/20万/60秒 = 1.25分,删除key时cpu占用率约为25%。 建议配置:
  • DCS过期Key扫描 基于开源Redis以上机制,分布式缓存服务提供了一种通用的方式,来定时释放所有已经过期Key占用的内存,通过自行配置定时任务,在任务执行期间,会对所有缓存实例的主节点进行扫描操作,扫描操作会遍历整个实例的键空间,触发Redis引擎中对Key过期的判断,从而释放已过期的Key。 只有Redis 4.0、Redis 5.0、和Redis 6.0基础版实例支持过期key扫描。 建议在业务低峰时段执行过期Key扫描,降低CPU被用满的可能。 不支持查询已释放的过期Key。
  • 响应示例 状态码: 200 设置热key自动分析配置成功。 { "instance_id" : "5f9057b5-c330-4ee2-8138-7e69896eeec3", "enable_auto_scan" : true, "schedule_at" : [ "21:00" ], "updated_at" : "2020-06-17T02:42:40.793Z" } 状态码: 400 非法请求。 { "error_code" : "DCS.4922", "error_msg" : "Does not support hotkey analyze." }
  • 请求示例 设置热key自动分析任务,每日缓存分析时间为21:00。 PUT https://{dcs_endpoint}/v2/a4d31cb6-3d72-4fdc-8ec9-6e3a41e47f71/instances/5560df16-cebf-4473-95c4-d1b573c16e79/hotkey/autoscan { "enable_auto_scan" : true, "schedule_at" : [ "21:00" ] }
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 instance_id String 所属实例ID。 enable_auto_scan Boolean 是否开启缓存分析定时任务。 schedule_at Array of strings 每日分析时间,时间格式为21:00,时间为UTC时间。 updated_at String 配置更新时间,时间格式为2020-06-15T02:21:18.669Z。 状态码: 400 表4 响应Body参数 参数 参数类型 描述 error_msg String 错误信息。 最大长度:1024 error_code String 错误码。 最大长度:9 error_ext_msg String 扩展错误信(暂未使用,赋值为null)。 最大长度:1024 状态码: 401 表5 响应Body参数 参数 参数类型 描述 error_msg String 错误信息。 最大长度:1024 error_code String 错误码。 最大长度:9 error_ext_msg String 扩展错误信(暂未使用,赋值为null)。 最大长度:1024 状态码: 403 表6 响应Body参数 参数 参数类型 描述 error_msg String 错误信息。 最大长度:1024 error_code String 错误码。 最大长度:9 error_ext_msg String 扩展错误信(暂未使用,赋值为null)。 最大长度:1024 状态码: 404 表7 响应Body参数 参数 参数类型 描述 error_msg String 错误信息。 最大长度:1024 error_code String 错误码。 最大长度:9 error_ext_msg String 扩展错误信(暂未使用,赋值为null)。 最大长度:1024 状态码: 500 表8 响应Body参数 参数 参数类型 描述 error_msg String 错误信息。 最大长度:1024 error_code String 错误码。 最大长度:9 error_ext_msg String 扩展错误信(暂未使用,赋值为null)。 最大长度:1024
  • 响应示例 状态码: 200 查询热key分析详情成功。 { "id" : "858ee14c-2271-4489-8b82-7bda7459ae3e", "instance_id" : "5f9057b5-c330-4ee2-8138-7e69896eeec3", "status" : "success", "scan_type" : "manual", "created_at" : "2020-06-15T02:21:18.669Z", "started_at" : "2020-06-15T02:21:23.534Z", "finished_at" : "2020-06-15T02:21:25.588Z", "keys" : [ { "name" : "dcs-hotkey-test", "type" : "string", "shard" : "192.168.1.134:6379", "db" : 0, "size" : 3000, "unit" : "byte", "freq" : 4 } ] } 状态码: 400 非法请求。 { "error_code" : "DCS.4922", "error_msg" : "Does not support hotkey analyze." }
  • 响应参数 状态码: 200 表2 响应Body参数 参数 参数类型 描述 id String 热key分析记录ID。 instance_id String 实例ID。 status String 分析任务状态。 枚举值: waiting running success failed scan_type String 分析方式。 枚举值: manual auto created_at String 分析任务创建时间,格式为:"2020-06-15T02:21:18.669Z"。 started_at String 分析任务开始时间,格式为:"2020-06-15T02:21:18.669Z"(创建分析任务时此值为null,不返回)。 finished_at String 分析任务结束时间,格式为:"2020-06-15T02:21:18.669Z"(创建分析任务时此值为null,不返回)。 num Integer 热key的数量。 keys Array of HotkeysBody objects 热key记录(创建分析任务时此值为null,不返回)。 表3 HotkeysBody 参数 参数类型 描述 name String Key名称。 type String Key类型。 枚举值: string list set zset hash shard String 热key所在的分片,仅在实例类型为集群时支持,格式为ip:port。 db Integer 热key所在的DB。 size Long Key的value大小。 unit String 表示key的单位。count:key的数量,byte:key的大小。 freq Integer 表示某个key在一段时间的访问频度,会随着访问的频率而变化。 该值并不是简单的访问频率值,而是一个基于概率的对数计数器结果,最大为255(可表示100万次访问),超过255后如果继续频繁访问该值并不会继续增大,同时默认如果每过一分钟没有访问,该值会衰减1。 状态码: 400 表4 响应Body参数 参数 参数类型 描述 error_msg String 错误信息。 最大长度:1024 error_code String 错误码。 最大长度:9 error_ext_msg String 扩展错误信(暂未使用,赋值为null)。 最大长度:1024 状态码: 401 表5 响应Body参数 参数 参数类型 描述 error_msg String 错误信息。 最大长度:1024 error_code String 错误码。 最大长度:9 error_ext_msg String 扩展错误信(暂未使用,赋值为null)。 最大长度:1024 状态码: 403 表6 响应Body参数 参数 参数类型 描述 error_msg String 错误信息。 最大长度:1024 error_code String 错误码。 最大长度:9 error_ext_msg String 扩展错误信(暂未使用,赋值为null)。 最大长度:1024 状态码: 404 表7 响应Body参数 参数 参数类型 描述 error_msg String 错误信息。 最大长度:1024 error_code String 错误码。 最大长度:9 error_ext_msg String 扩展错误信(暂未使用,赋值为null)。 最大长度:1024 状态码: 500 表8 响应Body参数 参数 参数类型 描述 error_msg String 错误信息。 最大长度:1024 error_code String 错误码。 最大长度:9 error_ext_msg String 扩展错误信(暂未使用,赋值为null)。 最大长度:1024