- 最新动态
- 功能总览
- 服务公告
- 产品介绍
- 计费说明
- 快速入门
- 用户指南
- 最佳实践
- API参考
- SDK参考
-
常见问题
- 实例类型/版本
- 实例特性
- 安全性
-
客户端和网络连接
- DCS实例支持公网访问吗?
- Redis连接失败问题排查和解决
- DCS实例是否支持跨VPC访问?
- Redis公网访问所需弹性IP是否收费?
- Redis连接时报错:“(error) NOAUTH Authentication required”。
- 客户Http的Server端关闭导致Redis访问失败
- 客户端出现概率性超时错误
- 使用Jedis连接池报错如何处理?
- 如何使用Redis-desktop-manager访问Redis实例?
- 使用SpringCloud时出现ERR Unsupported CONFIG subcommand怎么办?
- 客户端无法使用域名连接DCS缓存实例时如何处理?
- 本地环境是否可以连接缓存实例?
- 使用Redis实例的发布订阅(pubsub)有哪些注意事项?
- Redis 3.0实例公网开关被关闭是什么原因?
- 使用短连接访问Redis出现“Cannot assign requested address”错误
- 连接池选择及Jedis连接池参数配置建议
- 如何解决Lettuce 6.x版本客户端使用DCS实例兼容性问题?
- 应该选择域名还是IP地址连接Redis实例?
- 主备实例的只读地址是连接到主节点还是备节点?
-
Redis使用
- 是否支持CPU架构的变更?
- 实例是否支持变更可用区
- Redis实例能否修改VPC和子网?
- 实例是否支持自定义或修改端口?
- 实例是否支持修改访问地址?
- 实例无法删除是什么原因?
- 集群实例启动时间过长是什么原因?
- 使用redis_exporter出错怎么办?
- 什么是预留内存,如何配置预留内存?
- 创建的缓存实例为什么可使用内存比实例规格少一些?
- Redis 3.0 Proxy集群不支持redisson分布式锁的原因
- DCS Redis有没有后台管理软件?
- DCS缓存实例的数据被删除后,能否找回?
- 为什么实例实际可用内存比申请规格小而且已使用内存不为0?
- 如何查看Redis内存占用量
- Cluster集群实例容量和性能未达到瓶颈,但某个分片容量或性能已过载是什么原因?
- 访问Redis报OOM错误提示
- 不同编程语言如何使用Cluster集群客户端
- 使用Cluster的Redis集群时建议配置合理的超时时间
- 读取redis数据报超时错误
- hashtag的原理、规则及用法示例
- Redis key丢失是什么原因
- 重启实例后缓存数据会保留吗?
- 如何确认实例是单DB还是多DB
- Proxy集群开启多DB的使用限制及操作方式
- 如何创建多DB的Proxy集群实例?
- 扩容缩容与实例升级
-
数据备份/导出/迁移
- DCS实例是否兼容低版本Redis迁移到高版本
- 不同类型的操作系统间进行数据传递和操作,需要注意什么?
- 源Redis使用了多DB,能否迁移数据到集群实例?
- 源Redis迁移到集群实例中有哪些限制和注意事项?
- 在线迁移需要注意哪些?
- 在线迁移能否做到完全不中断业务?
- 在线迁移实例源端报“Disconnecting timedout slave”和“overcoming of output buffer limits”
- 如何导出Redis实例数据?
- 使用Rump工具迁移数据,命令执行后无报错,但Redis容量无变化
- 是否支持控制台导出RDB格式的Redis备份文件?
- 缓存实例备份文件如何存放?备份文件的数量是否有限制?
- Redis在线数据迁移是迁移整个实例数据么?
- AOF文件在什么情况下会被重写
- Redis迁移失败有哪些常见原因?
- 一个数据迁移能迁移到多个目标实例么?
- 怎么放通SYNC和PSYNC命令?
- 迁移或导入备份数据时,相同的Key会被覆盖吗?
- Cluster集群实例使用内置key且跨slot的Lua脚本时迁移失败
- 迁移故障处理
- 数据迁移失败问题排查
- Memcached如何迁移?
- 是否支持Memcached和Redis之间实例数据的迁移?
- 大Key/热Key分析/过期Key扫描
- Redis命令
- 监控告警
- 主备倒换
- 创建实例和权限
- Memcached使用
- 故障排除
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
DCS Redis 4.0支持的新特性说明
与Redis 3.0版本相比,Redis 4.0及以上版本,除了开源Redis增加的特性之外,创建耗时也相应缩短。
实例由虚机方式改成了物理机容器化部署,创建实例只需要8~10秒时间完成。
Redis 4.0版本更新的特性,主要涉及三个方面:
- 新命令的增加,如MEMORY、SWAPDB。
- Lazyfree机制,延迟删除大key,降低删除操作对系统资源的占用影响。
- 内存性能优化,即主动碎片整理。
MEMORY命令
在Redis 3.0及之前,只能通过info memory命令了解有限的几个内存统计信息。Redis 4.0引入新的命令memory,让您能够更深入了解Redis的内存使用情况。
127.0.0.1:6379[8]> memory help 1) "MEMORY DOCTOR - Outputs memory problems report" 2) "MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key" 3) "MEMORY STATS - Show memory usage details" 4) "MEMORY PURGE - Ask the allocator to release memory" 5) "MEMORY MALLOC-STATS - Show allocator internal stats"
127.0.0.1:6379[8]> memory help 1) MEMORY <subcommand> arg arg ... arg. Subcommands are: 2) DOCTOR - Return memory problems reports. 3) MALLOC-STATS -- Return internal statistics report from the memory allocator. 4) PURGE -- Attempt to purge dirty pages for reclamation by the allocator. 5) STATS -- Return information about the memory usage of the server. 6) USAGE <key> [SAMPLES <count>] -- Return memory in bytes used by <key> and its value. Nested values are sampled up to <count > times (default: 5).
usage命令
输入memory usage [key],如果当前key存在,则返回key的value实际使用内存估算值;如果key不存在,则返回nil。不同Redis版本计算使用内存时可能会有差异,返回结果可能会有不同。
127.0.0.1:6379[8]> set dcs "DCS is an online, distributed, in-memory cache service compatible with Redis, and Memcached." OK 127.0.0.1:6379[8]> memory usage dcs (integer) 141 127.0.0.1:6379[8]>
- usage统计value内存占用,以及key自身的内存占用,不包含key的Expire内存占用。不同Redis版本,统计结果可能有差异。
//以下内容基于Redis 5.0.2版本验证 192.168.0.66:6379> set a "Hello, world!" OK 192.168.0.66:6379> memory usage a (integer) 58 192.168.0.66:6379> set abc "Hello, world!" OK 192.168.0.66:6379> memory usage abc (integer) 60 //key名称长度变化后,内存占用也有变化,说明usage统计包含了key自身的占用 192.168.0.66:6379> expire abc 1000000 (integer) 1 192.168.0.66:6379> memory usage abc (integer) 60 //加了过期时间后,内存占用没有改变,说明usage统计不包含expire内存占用 192.168.0.66:6379>
- 对hash、list、set、sorted set等数据类型,usage命令会抽样统计,提供内存占用的估算值。
使用方式:memory usage keyset samples 1000
其中keyset表示一个集合数据类型的key,1000表示抽样个数。
stats命令
返回当前实例内存使用细节。
使用方法:memory stats
127.0.0.1:6379[8]> memory stats 1) "peak.allocated" 2) (integer) 2412408 3) "total.allocated" 4) (integer) 2084720 5) "startup.allocated" 6) (integer) 824928 7) "replication.backlog" ... ...
以下给出部分数据返回项的具体含义。
数据返回项 |
说明 |
---|---|
peak.allocated |
Redis实例运行过程中,allocator分配的内存峰值。同info memory的used_memory_peak |
total.allocated |
allocator当前分配的内存字节数。同info memory的used_memory |
startup.allocated |
Redis启动占用的内存字节数 |
replication.backlog |
Redis复制积压缓冲区(replication backlog)内存使用字节数,通过repl-backlog-size参数设置,默认1M |
clients.slaves |
在master侧,所有slave clients消耗的内存字节数 |
clients.normal |
Redis所有常规客户端消耗内存字节数 |
overhead.total |
Redis额外的总开销内存字节数; 即分配器分配的总内存total.allocated,减去数据实际存储使用内存。 |
keys.count |
Redis实例中key的数量 |
keys.bytes-per-key |
每个key平均占用字节数。注意,overhead也会均摊到每个key上,因此不能以此值来表示业务实际的key平均长度。 |
dataset.bytes |
表示Redis数据占用的内存容量。即分配的内存总量,减去总的额外开销内存量。 |
dataset.percentage |
表示Redis数据占用内存占总内存分配的百分比 |
peak.percentage |
当前内存使用量与峰值时的占比 |
fragmentation |
表示Redis的内存碎片率 |
doctor命令
使用方法: memory doctor
- peak分配内存大于当前total_allocated的1.5倍,即peak.allocated/total.allocated > 1.5,说明内存碎片率高,RSS远大于used_memory
- High fragmentation/fragmentation大于1.4,说明内存碎片率高
- 每个Normal Client平均使用内存大于200KB,说明pipeline可能使用不当,或Pub/Sub客户端处理消息不及时
- 每个Slave Client平均使用内存大于10MB,说明master的写入流量过高
purge命令
使用方法: memory purge
用途:通过调用jemalloc内部命令,进行内存释放。释放对象包括Redis进程占用但未有效使用的内存,即常说的内存碎片。
memory purge只适用于使用jemalloc作为allocator的Redis实例。
Lazy free机制
解决的痛点/问题
Redis是单线程程序,当运行一个耗时较大的请求时,会导致所有请求排队等待,在请求处理完成前,Redis不能响应其他请求,因此容易引发性能问题。而Redis删除大的集合键时,就属于一种比较耗时的请求。
原理
Redis 4.0提供的一种惰性删除或者说延迟释放机制,主要用于解决删除大key对Redis进程的阻塞,从而避免带来性能与可用性问题。
删除key时,Redis异步延时释放key的内存,把key释放操作放在bio(Background I/O)单独的子线程处理中。
使用方法
- 主动删除
- unlink
unlink与del命令目的一样,删除某个key。unlink在删除集合类键时,如果集合键的元素个数大于64个,会把内存释放操作,给单独的bio(Background I/O)线程来执行。因此unlink删除操作能在非常短的时间内完成包含上百万个元素的大key删除。
- flushall/flushdb
通过对flushall/flushdb添加ASYNC异步清理选项,Redis在清理整个实例或单个DB时,操作都是异步的。
- unlink
- 过期key删除、大key驱逐删除
被动删除有四种场景,每种场景对应一个配置参数,默认都是关闭:
lazyfree-lazy-eviction no //针对redis内存使用达到maxmemory,并设置有淘汰策略时,是否采用lazy free机制 lazyfree-lazy-expire no //针对设置有TTL的键,过期后,被redis清理删除时是否采用lazy free机制 lazyfree-lazy-server-del no //针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作 slave-lazy-flush no //针对slave进行全量数据同步,slave在加载master的RDB文件前,会运行flushall来清理自己的数据场景
其他新增命令
- swapdb
用途:交换同一Redis实例内2个db的数据。
用法:swapdb dbindex1 dbindex2
- zlexcount
用途:在有序集合中,返回符合条件的元素个数。
用法:zlexcount key min max
内存使用和性能改进
- 使用更少的内存来存储相同数量的数据
- 可以对使用的内存进行碎片整理,并逐渐回收