华为云用户手册

  • 为了减少大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扫描
  • 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时,操作都是异步的。 过期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来清理自己的数据场景
  • 连接实例必须使用密码吗?如何获取密码? Redis实例支持密码模式和免密模式。Redis本身支持不设置密码,客户端可以直接连接Redis缓存服务并使用,但出于安全考虑,建议尽量选用密码模式,通过密码来鉴权验证,提升安全性。若选用密码模式,您需要在创建实例时自定义密码。 Memcached实例支持密码模式和免密模式,用户可以根据自身应用特点选用支持文本和二进制协议的任何Memcached客户端。若选用密码模式,您需要在创建实例时自定义密码。 如需修改Redis访问方式、修改或重置密码,请参考密码管理。 父主题: 安全性
  • Redis实例支持的单个Key和Value数据大小是否有限制? Key的大小上限为512M。 建议key的大小不超过1KB,这样既节约存储空间,也利于Redis进行检索。 String类型的value值上限为512M。 集合、链表、哈希等key类型,单个元素的value上限为512M。 事实上,集合、链表、哈希都可以看成由String类型的key按照一定的映射关系组合而成。 同时,请注意避免对大Value进行长时间高并发写入,这样会影响网络传输效率,也会增加redis-server的内部处理耗时,从而导致请求时延较大。 父主题: 实例特性
  • 查看DCS性能监控 登录分布式缓存服务管理控制台。 在管理控制台左上角单击,选择实例所在的区域。 单击左侧菜单栏的“缓存管理”,进入缓存实例信息页面。 单击需要查看性能监控指标的缓存实例,进入实例基本信息页面。 单击“性能监控”,页面显示该实例的所有监控指标信息。 您也可以在需要查看的缓存实例的“操作”列,单击“查看监控”,进入 云监控服务 的页面查看,这和在缓存实例信息页面“性能监控”页签内容一致。
  • DCS实例是否支持跨VPC访问? 跨VPC访问,即客户端和实例不在同一个VPC。 对于未开启公网访问的实例,一般情况下,不同VPC间网络不互通,不在同一VPC下的弹性云服务器无法访问DCS缓存实例。 可以通过创建VPC对等连接,将两个VPC的网络打通,实现跨VPC访问DCS缓存实例。 用户通过VPC对等访问DCS缓存实例时,除了满足VPC对等网跨VPC访问的约束之外,还存在如下约束: 当创建实例时使用了172.16.0.0/12~24网段时,客户端不能在192.168.1.0/24、192.168.2.0/24、192.168.3.0/24网段。 当创建实例时使用了192.168.0.0/16~24网段时,客户端不能在172.31.1.0/24、172.31.2.0/24、172.31.3.0/24网段。 当创建实例时使用了10.0.0.0/8~24网段时,客户端不能在172.31.1.0/24、172.31.2.0/24、172.31.3.0/24网段。 关于创建和使用VPC对等连接,请参考VPC对等连接说明。 父主题: 客户端和网络连接
  • 应该选择 域名 还是IP地址连接Redis实例? 对于Redis单机、Proxy集群、读写分离实例: 每个实例只有1个IP地址和1个域名连接地址。实例发生主备交换前后,实例的IP地址和域名连接地址都不会改变。选择域名连接或IP连接不影响功能的使用。 对于Redis基础版主备实例: 每个实例有1个IP地址和2个域名连接地址,包含1个只读域名。实例发生主备交换前后,实例的IP地址和域名连接地址都不会改变。选择域名连接或IP连接不影响功能的使用。 使用域名连接时,需要考虑业务的读写请求区别,选择“连接地址”或“IP地址”连接不影响功能的使用,使用“只读地址”连接时只处理读请求(有读写分离需求的用户推荐直接使用读写分离实例)。 对于Redis 6.0企业版: 请使用域名连接实例,IP地址可能有多个或发生变化。 对于Cluster集群实例: Cluster集群是多主多从架构,有多组主从节点IP地址和1个域名连接地址。选择域名连接或IP连接不影响功能的使用。 使用IP地址连接实例时,可以使用任意一个IP地址连接实例,连接的节点会将请求发送到正确的节点上,使Cluster的全部节点都可以接收请求。建议配置多个或全部IP地址连接,避免所配置的IP地址所在节点故障时导致连接失败。 域名解析返回的IP数量最多为50个,如需限制解析返回的IP数量,请联系后台管理人员。 如果客户端服务器和Redis实例不在同一Region,需要跨Region访问Redis实例时,实例域名无法跨Region解析,无法通过域名访问。可以通过在hosts中手动配置域名与IP绑定关系或使用IP进行访问。参考Redis连接约束。 连接实例请参考连接Redis缓存实例。 父主题: 客户端和网络连接
  • Redis实例是否支持多DB方式? Redis实例支持多DB方式的情况如下: Redis单机、读写分离和主备缓存实例支持多数据库(多DB),默认256个,DB编号为0-255。默认使用的是DB0。多数据库主要用于数据隔离,每个数据库的大小不是平均分配,可能会出现一个数据库将实例的内存完全占用的情况。 Redis Proxy集群默认只有一个DB。 如需创建多DB的Proxy集群实例请参考如何创建多DB的Proxy集群实例。 创建单DB的Proxy集群实例后,如需开启多DB的操作请参考Proxy集群使用多DB限制。 Redis 3.0 proxy不支持开启多DB。 Redis Cluster集群实例不支持多DB,只有一个DB,即DB0。 DB的个数不支持修改,每个DB的大小也不支持自定义。 父主题: 实例特性
  • Redis集群可以读取每个节点的IP地址吗? Redis 3.0版本的集群实例(Proxy版本)的使用方式与单机、主备实例相同,无需知晓后端地址。 Redis 4.0及以上版本的集群实例(Cluster版本)可以使用cluster nodes命令获取。 redis-cli -h {redis_address} -p {redis_port} -a {redis_password} cluster nodes 在命令返回的结果中,获取所有master节点的IP端口,如下图所示。 父主题: 实例特性
  • 使用Redis实例的发布订阅(pubsub)有哪些注意事项? Redis实例的发布订阅功能详细信息参见Pub/Sub,使用Redis发布订阅功能时有如下事项请注意: 客户端需要及时消费和处理消息。 客户端订阅了channel之后,如果接收消息不及时,可能导致DCS实例消息堆积,当达到消息堆积阈值(默认值为32MB),或者达到某种程度(默认8MB)一段时间(默认为1分钟)后,服务器端会自动断开该客户端连接,避免导致内部内存耗尽。 客户端需要支持重连。 当连接断开之后,客户端需要使用subscribe或者psubscribe重新进行订阅,否则无法继续接收消息。 不建议用于消息可靠性要求高的场景中。 Redis的pubsub不是一种可靠的消息系统。当出现客户端连接退出,或者极端情况下服务端发生主备切换时,未消费的消息会被丢弃。 父主题: 客户端和网络连接
  • 如何使用Redis-desktop-manager访问Redis实例? 如下分别介绍通过内网和公网使用Redis-desktop-manager访问Redis 3.0实例的操作。 使用VPC子网访问 填写DCS实例子网地址,端口6379,以及相应密码。 单击左下角“测试连接”。 提示成功后,说明连接正常。 图1 通过内网使用Redis-desktop-manager访问Redis实例 使用Redis-desktop-manager访问DCS集群实例时,执行redis命令是正常的,但是左侧显示异常,这个是因为DCS集群是基于codis架构,info命令的输出和原生的redis不一样。 使用公网访问 使用公网访问,需要注意SSL是否开启。 如果SSL关闭,则只需要把地址填写实例的公网访问地址即可。 注意需要放开实例安全组的入方向6379端口。 如果SSL开启,需要在本地安装Stunnel客户端,才能通过redis-desktop-manager访问Redis。需要注意的是: 必须安装Stunnel客户端,安装配置可参考Stunnel客户端安装配置。 Redis-desktop-manaer访问地址必须填写127.0.0.1,不能填写公网IP,否则出现“connection reset”。 因为SSL开启时,本地访问公网Redis,实际是通过Stunnel搭建的加密隧道。即Redis-desktop-manager访问Stunnel在127.0.0.1监听的socket后,Stunnel通过加密传输到公网Redis的36379端口。 注意需要放开实例安全组的入方向36379端口。 如果SSL已经关闭,需要将其打开,只需要把公网访问关闭,重新打开的时候,启用SSL即可。相反,SSL已经打开,要将其关闭,操作是类似的。 父主题: 客户端和网络连接
  • 解决方案 方案一(推荐方案): 开启Cluster集群自动刷新拓扑配置。 ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder() // 每隔time毫秒周期性刷新 .enablePeriodicRefresh(Duration.ofMillis(time)) // MOVED重定向, ASK重定向, 重连, 未知节点(since 5.1), 槽位不在当前所有分片中(since 5.2),当出现这五种情况时会触发自适应刷新 .enableAllAdaptiveRefreshTriggers() .build(); 具体实现请参考Lettuce客户端连接Cluster集群实例。 Lettuce客户端连接Cluster集群实例,如果未开启拓扑刷新,规格变更后,需要重启客户端。 方案二: 关闭“验证集群节点成员资格开关”,关闭方式如下: ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder() .validateClusterNodeMembership(false) .build(); 原理:若validateClusterNodeMembership为true时,连接前检查当前连接地址是否在集群拓扑关系中(通过CLUSTER NODES获得),若不在则会出现上述异常问题。 关闭“验证集群节点成员资格开关”的影响: 缺少防止安全漏洞的检验; 若未开启集群自动刷新拓扑,当Cluster集群执行变更规格后,若分片数增加时,可能会产生MOVED重定向请求,这个重定向过程会增加集群的网络负担和单次请求耗时;若分片数因删除减少时,会出现无法连接已删除分片的异常情况。
  • Redis实例支持的逐出策略 在达到内存上限(maxmemory)时,Redis支持选择以下8种数据逐出策略: noeviction:在这种策略下,如果缓存达到了配置的上限,实例将不再处理客户端任何增加缓存数据的请求,比如写命令,实例直接返回错误给客户端。缓存达到上限后,实例只处理删除和少数几个例外请求。 allkeys-lru:根据LRU(Least recently used,最近最少使用)算法尝试回收最少使用的键,使得新添加的数据有空间存放。 volatile-lru:根据LRU(Least recently used,最近最少使用)算法尝试回收最少使用的键,但仅限于具有“expire”字段集的键,使得新添加的数据有空间存放。 allkeys-random:回收随机的键使得新添加的数据有空间存放。 volatile-random:回收随机的键使得新添加的数据有空间存放,但仅限于具有“expire”字段集的键。 volatile-ttl:回收具有“expire”字段集中的键,且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。 allkeys-lfu:从所有键中驱逐最不常用的键。 volatile-lfu:从具有“expire”字段集的所有键中驱逐最不常用的键。 当没有键满足回收前提条件时,数据逐出策略volatile-lru、volatile-random、volatile-ttl与noeviction策略相同,具体见上文noeviction介绍。 2020年7月之前创建的Redis实例,逐出策略默认为noeviction。2020年7月及之后创建的实例,逐出策略默认为volatile-lru。
  • 客户端出现概率性超时错误 针对低概率超时错误,是Redis使用的正常现象。Redis使用受到网络传输、客户端设置超时时间等因素影响,可能出现单个请求超时问题。 建议客户业务编码时,具备重试操作,提升业务的可靠性,避免低概率的单次请求失败时业务失败。 当出现了连接超时问题时,可以优先检查Redis是否开启了AOF持久化功能,并根据业务需求,决定是否开启AOF持久化(开启/关闭AOF持久化的影响)。关闭AOF持久化可以提升客户端连接的稳定性,减少出现阻塞,连接不上的情况。 如果出现超时错误概率频繁,请联系技术服务人员。 父主题: 客户端和网络连接
  • 问题分析 Cluster集群规格变更原理: 客户端根据RESP2协议的内容,启动后从Cluster集群获取节点拓扑信息(Cluster Nodes),并将其拓扑关系维护在客户端的内存数据结构中。 对于数据访问,客户端会根据Key值按照CRC16算法进行Hash计算Slot信息,根据内存中保存的节点拓扑关系和Slot的对应信息进行请求自动路由。 在扩容/缩容过程中,当实例分片数发生变化时,存在节点拓扑关系和Slot对应信息的变化,需要客户端进行拓扑关系的自动更新,否则可能造成请求路由失败或者路由位置错误等,造成客户端访问报错。 例如,3分片Cluster集群实例扩容为6分片Cluster集群实例时,节点拓扑关系和Slot对应信息变化如下图所示: 图2 Cluster集群实例扩容前 图3 Cluster集群实例扩容后
  • Redis命令执行失败的可能原因 Redis命令执行失败,一般有以下可能原因: 命令拼写不正确 如下图所示,命令拼写有误,Redis实例返回“ERR unknown command”,删除key的正确命令为del。 在低版本Redis实例运行高版本命令 如下图所示,在Redis 3.0版本运行Redis 5.0新增的Stream相关命令,Redis实例返回命令出错信息。 DCS Redis不支持的部分命令。 出于安全原因,DCS禁用了部分命令,具体参考Redis命令的兼容性,查看禁用命令与受限使用命令。 在控制台提供的Web CLI界面执行命令失败。 Web CLI工具除了同样不支持上述列出的禁用命令与受限命令,对keys命令也有一定的使用限制。 执行lua脚本失败。 例如报错:ERR unknown command 'EVAL' ,说明您的Redis实例属早期创建的低版本Redis实例,不支持lua脚本,这种情况请提工单联系技术支持,升级您的Redis实例。 执行setname和getname失败。 说明您的Redis实例属早期创建的低版本Redis实例,不支持这两个命令,这种情况请提工单联系技术支持,升级您的Redis实例。 2018年7月10日前创建的Redis集群实例,以下命令被禁用,客户端执行时也会收到命令出错信息。如果需要支持,请提工单联系技术支持,升级集群实例。 SINTER、SDIFF、SUNION、PFCOUNT、PFMERGE、SINTERSTORE、SUNIONSTORE、SDIFFSTORE、SMOVE、BLPOP、BRPOP、BRPOPLPUSH、ZUNIONSTORE,、ZINTERSTORE、EVAL、EVALSHA、BITOP、RENAME、RENAMENX、RPOPLPUSH、MSETNX、SCRIPT LOAD、SCRIPT KILL、SCRIPT EXISTS、SCRIPT FLUSH。 父主题: Redis命令
  • 使用Jedis连接池报错如何处理? 在使用Jedis连接池JedisPool模式下,比较常见的报错如下: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 首先确认DCS缓存实例是正常运行中状态,然后按以下步骤进行排查。 检查网络。 核对IP地址配置。 检查jedis客户端配置的IP地址是否与DCS缓存实例的连接地址或IP地址一致,如果是通过公网访问,则检查是否与DCS缓存实例绑定的弹性IP地址一致,不一致则修改一致后重试。 测试网络。 在客户端使用ping和Telnet小工具测试网络。 如果ping不通: VPC内访问时,要求客户端与DCS缓存实例的VPC相同,并且正确配置安全组或白名单。 公网SSL方式访问Redis 3.0时,要求DCS缓存实例安全组放开了36379端口访问。 公网直接访问Redis 3.0(非SSL方式)时,要求DCS缓存实例安全组放开了6379端口访问。 如果IP地址可以ping通,telnet对应的端口不通,则尝试重启实例,如重启后仍未恢复,请联系技术支持。 检查连接数是否超限。 查看已建立的网络连接数是否超过JedisPool配置的上限。如果连接数接近配置的上限值,则建议重启服务观察。如果明显没有接近,排除连接数超限可能。 Unix/Linux系统使用: netstat -an | grep 6379 | grep ESTABLISHED | wc -l Windows系统使用: netstat -an | find "6379" | find "ESTABLISHED" /C 检查JedisPool连接池代码。 如果连接数接近配置的上限,请分析是业务并发原因,或是没有正确使用JedisPool所致。 对于JedisPool连接池的操作,每次调用jedisPool.getResource()方法之后,需要调用jedisPool.returnResource()或者jedis.close()进行释放,优先使用close()方法。 检查客户端TIME_WAIT是否过多。 通过ss -s查看time wait链接是否过多。 如果TIME_WAIT过多,可以调整内核参数(/etc/sysctl.conf): ##当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击net.ipv4.tcp_syncookies = 1##允许将TIME-WAIT sockets重新用于新的TCP连接net.ipv4.tcp_tw_reuse = 1##开启TCP连接中TIME-WAIT sockets的快速回收net.ipv4.tcp_tw_recycle = 1##修改系统默认的TIMEOUT时间net.ipv4.tcp_fin_timeout = 30 调整后重启生效:/sbin/sysctl -p 如果按照以上原因排查之后问题仍没有解决,可以通过抓包并将异常时间点、异常信息以及抓包文件发送给技术支持协助分析。 抓包可使用tcpdump工具,命令如下: tcpdump -i eth0 tcp and port 6379 -n -nn -s 74 -w dump.pcap Windows系统下还可以安装Wireshark工具抓包。 公网访问Redis 3.0时请将端口改成36379。 网卡名请改成实际的网卡名称。 父主题: 客户端和网络连接
  • 是否存在Redis的持久化重写操作 除单机及单副本Cluster集群实例外,华为云其他Redis实例默认开启AOF数据落盘,实例开启了AOF持久化功能后,会定期进行AofRewrite的磁盘整理,AOF磁盘持久化整理一般在以下2种场景执行: 数据量写入不大,AOF文件不大时,固定在每天的凌晨1-4点进行AOF持久化重写。所以容易出现这个时间点实例CPU使用率超高的现象。 数据量写入过大,AOF文件大小超过阈值(缓存实例容量的3-5倍)时,不论当前的所处的时间,会自动触发后台AOF持久化重写。 Redis的持久化重写操作(Bgsave或Bgrewriteaof)比较消耗CPU资源(请参考为什么使用Fork执行Bgsave和Bgrewriteaof),Bgsave和Bgrewriteaof会调用系统的Fork机制,造成CPU短暂时间冲高。 如果客户没有需要用到持久化功能,建议将该功能关闭(请根据实际业务慎重操作,关闭持久化功能会导致极端故障场景下恢复时,由于没有落盘造成的数据丢失)。关闭操作:在实例详情页面,选择“配置参数”页签,将“appendonly”修改为“no”。
  • 查找并禁用高消耗命令 使用了keys等消耗资源的命令,高消耗资源的命令即时间复杂度为O(N)或更高的命令,通常情况下,命令时间复杂度越高,在执行时消耗的资源越高,这会导致CPU使用率超高,容易触发主备倒换。关于各命令对应的时间复杂度信息请参见Redis官网。例如,使用了keys等消耗资源的命令,导致CPU超高,建议客户改成scan命令或者禁用keys命令。 通过性能监控功能,确认CPU使用率高的具体时间段。 通过下述方法,找出高消耗的命令。 慢查询功能会记录执行超过指定时间阈值的命令,通过分析慢查询的语句和执行时长可帮助您找出高消耗命令,具体操参见慢查询。 通过实例诊断功能,选择CPU冲高的时间点进行诊断后,可以看到报告中的对应时间段命令的执行情况以及CPU耗时百分比,具体操作参见实例诊断。 处理措施。 评估并禁用高风险命令和高消耗命令,例如FLUSHALL、KEYS、HGETALL等。 优化业务,例如避免频繁执行数据排序操作。 可选:根据业务情况,选择下述方法对实例进行调整: 调整实例为读写分离实例,对高消耗命令或应用进行分流。 扩容实例增强实例处理能力。
  • 使用redis_exporter出错怎么办? 通过在命令行启动redis_exporter,根据界面输出,查看是否存在错误,根据错误描述,进行问题排查。 [root@ecs-swk /]./redis_exporter -redis.addr 192.168.0.23:6379INFO[0000] Redis Metrics Exporter V0.15.0 build date:2018-01-19-04:08:01 sha1: a0d9ec4704b4d35cd08544d395038f417716a03a Go:go1.9.2INFO[0000] Providing metrics at :9121/metricsINFO[0000] Connecting to redis hosts: []string{192.168.0.23:6379}INFO[0000] Using alias:[]string{""} 父主题: Redis使用
  • Redis命令执行不生效 如果客户端代码业务异常,怀疑是Redis命令不生效,可以通过Redis-cli执行命令和查看数据,判断Redis命令执行是否异常。 以下列举两个场景: 场景一:通过设置key值和查看key值,即可判断该命令是否生效。 Redis通过set命令写String类型数据,但是数据未变化,则可以使用Redis-cli命令访问Redis实例,执行如下命令: 场景二:通过expire命令设置过期事件,但是怀疑过期时间不对,则可以执行如下操作: 设置10秒过期时间,然后执行ttl命令查看过期时间,如下图表示,执行ttl命令时,过期时间剩下7秒。 Redis客户端和服务端通过二进制协议进行通信,使用Redis-cli、Jedis、Python客户端并没有差异。 因此如果怀疑Redis有问题,但是使用Redis-cli排查没问题,那就很可能是业务代码存在问题,如果日志没有明显错误信息,则建议在代码添加日志支撑进一步分析。 父主题: Redis命令
  • Redis命令执行是否有超时时间?超时了会出现什么结果? Redis超时分为客户端超时和服务端超时。 客户端命令超时时间一般由客户端代码自行控制,业务侧需要根据自己的业务特点选择合适的超时时间(例如Java的Lettuce客户端,该参数名为timeout)。 客户端如果发生命令执行超时,根据不同客户端的逻辑控制,可能会发生超时报错、命令堵塞、客户端连接重试等情况。 Redis服务端Timeout默认配置为0,不会主动断开连接,如果需要修改配置,可以参考修改实例配置参数。 如果实例配置了该Timeout参数值(不为0),当客户端与服务端空闲连接超过该参数值时,连接会断开。 父主题: Redis命令
  • RDB支持存储LFU、LRU Redis 5.0开始,RDB快照文件中增加存储key逐出策略LRU和LFU: FIFO:先进先出。最早存储的数据,优先被淘汰。 LRU:最近最少使用。长期未使用的数据,优先被淘汰。 LFU:最不经常使用。在一段时间内,使用次数最少的数据,优先被淘汰。 Redis 5.0的RDB文件格式有变化,向下兼容。因此如果使用快照的方式迁移,可以从Redis低版本迁移到Redis 5.0,但不能从Redis 5.0迁移到低版本。
  • 内存使用优化 Redis 5.0在上一版本基础上,在内存使用上做了进一步优化。 主动碎片整理 当key被频繁修改,value长度不断变化时,Redis会为key分配新的内存空间。由于Redis追求高性能,实现了自己的内存分配器来管理内存,因此并不会将原有内存释放给OS,从而导致出现内存碎片。当used_memory_rss/used_memory高于1.5,一般认为内存碎片占比过高,内存利用率低。 因此,合理规划和使用缓存数据,规范数据写入,有助于减少内存碎片的产生。 Redis 3.0及以下:可以通过定期重启服务解决内存碎片问题。建议实际缓存数据不超过配置可用内存的50%。 Redis 4.0:支持主动整理内存碎片,服务在运行期间进行自动内存碎片清理。同时Redis 4.0支持通过memory purge命令手动清理内存碎片。 Redis 5.0:增强版主动碎片整理,配合Jemalloc版本更新,更快更智能,延时更低。 HyperLogLog算法优化 HyperLogLog是一种基数计数方法,使用少量的内存空间完成海量数据的计数统计,在Redis 5.0中,HyperLogLog算法得到改进,优化了计数统计时的内存使用效率。 举个例子:B树计数效率非常高,但是内存消耗也比较多。而HyperLogLog可节省大量存储空间。当B树需要1M内存统计,HyperLogLog只需要1kb。 内存信息统计报告能力增强 INFO命令返回信息更加详实。
  • Stream数据结构 Stream是Redis 5.0引入的一种新数据类型,它是一个全新的支持多播的可持久化消息队列。 Redis Stream的结构示意图如图1所示,它是一个可持久化的数据结构,用一个消息链表,将所有加入进来的消息都串起来。 Stream数据结构具有以下特性: Stream中可以有多个消费者组。 每个消费组都含有一个Last_delivered_id,指向消费组当前已消费的最后一个元素(消息)。 每个消费组可以含有多个消费者对象,消费者共享消费组中的Last_delivered_id,相同消费组内的消费者存在竞争关系,即一个元素只能被其中一个消费者进行消费。 消费者对象内还维持了一个Pending_ids,Pending_ids记录已发送给客户端,但是还没完成ACK(消费确认)的元素id。 Stream与Redis其他数据结构的比较,见表1。 图1 Stream数据结构示意图 表1 Stream与Redis现有数据结构比较 比较项 Stream List、Pub/Sub、Zset 复杂度 获取元素高效,复杂度为O(logN) List获取元素的复杂度为O(N) offset 支持offset,每个消息元素有唯一id。不会因为新元素加入或者其他元素淘汰而改变id。 List没有offset概念,如果有元素被逐出,无法确定最新的元素 持久化 支持消息元素持久化,可以保存到AOF和RDB中。 Pub/Sub不支持持久化消息。 消费分组 支持消费分组 Pub/Sub不支持消费分组 消息确认 支持ACK(消费确认) Pub/Sub不支持 性能 Stream性能与消费者数量无明显关系 Pub/Sub性能与客户端数量正相关 逐出 允许按时间线逐出历史数据,支持block,给予radix tree和listpack,内存开销少。 Zset不能重复添加相同元素,不支持逐出和block,内存开销大。 删除元素 不能从中间删除消息元素。 Zset支持删除任意元素 Stream相关命令介绍 接下来按照使用流程中出现的顺序介绍Stream相关命令。详细命令见表2 首先使用XADD添加流元素,即创建Stream,添加流元素时可指定消息数量最大保存范围。 然后通过XGROUP创建消费者组。 消费者使用XREADGROUP指令进行消费。 客户端消费完毕后使用XACK命令确认消息已消费成功。 图2 Stream相关命令介绍 表2 Stream的详细命令 命令 说明 语法 XACK 从流的消费者组的待处理条目列表(简称PEL)中删除一条或多条消息。 XACK key group ID [ID ...] XADD 将指定的流条目追加到指定key的流中。 如果key不存在,作为运行这个命令的副作用,将使用流的条目自动创建key。 XADD key ID field string [field string ...] XCLAIM 在流的消费者组上下文中,此命令改变待处理消息的所有权, 因此新的所有者是在命令参数中指定的消费者。 XCLAIM key group consumer min-idle-time ID [ID ...] [IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count] [FORCE] [JUSTID] XDEL 从指定流中移除指定的条目,并返回成功删除的条目的数量,在传递的ID不存在的情况下, 返回的数量可能与传递的ID数量不同。 XDEL key ID [ID ...] XGROUP 该命令用于管理流数据结构关联的消费者组。使用XGROUP你可以: 创建与流关联的新消费者组。 销毁一个消费者组。 从消费者组中移除指定的消费者。 将消费者组的最后交付ID设置为其他内容。 XGROUP [CREATE key groupname id-or-$] [SETID key id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername] XINFO 检索关于流和关联的消费者组的不同的信息。 XINFO [CONSUMERS key groupname] key key [HELP] XLEN 返回流中的条目数。如果指定的key不存在,则此命令返回0,就好像该流为空。 XLEN key XPENDING 通过消费者组从流中获取数据。检查待处理消息列表的接口,用于观察和了解消费者组中哪些客户端是活跃的,哪些消息在等待消费,或者查看是否有空闲的消息。 XPENDING key group [start end count] [consumer] XRANGE 返回流中满足给定ID范围的条目。 XRANGE key start end [COUNT count] XREAD 从一个或者多个流中读取数据,仅返回ID大于调用者报告的最后接收ID的条目。 XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] XREADGROUP XREAD命令的特殊版本,指定消费者组进行读取。 XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] XREVRANGE 与XRANGE相同,但显著的区别是以相反的顺序返回条目,并以相反的顺序获取开始-结束参数 XREVRANGE key end start [COUNT count] XTRIM XTRIM将流裁剪为指定数量的项目,如有需要,将驱逐旧的项目(ID较小的项目)。 XTRIM key MAXLEN [~] count 消息(流元素)消费确认 Stream与相比Pub/Sub,不仅增加消费分组模式,还支持消息消费确认。 当一条消息被某个消费者调用XREADGROUP命令读取或调用XCLAIM命令接管的时候, 服务器尚不确定它是否至少被处理了一次。 因此,一旦消费者成功处理完一条消息,它应该调用XACK知会Stream,这样这个消息就不会被再次处理, 同时关于此消息的PEL(pending_ids)条目也会被清除,从Redis服务器释放内存。 某些情况下,因为网络问题等,客户端消费完毕后没有调用XACK,这时候PEL内会保留对应的元素ID。待客户端重新连上后,XREADGROUP的起始消息ID建议设置为0-0,表示读取所有的PEL消息及自last_id之后的消息。同时,消费者消费消息时需要能够支持消息重复传递。 图3 ACK机制解读
  • DCS是否支持哨兵模式接入? Redis 4.0及以上版本: 单机、主备、Cluster集群实例不支持哨兵模式接入。 读写分离支持哨兵模式和集群模式接入。 Proxy集群实例默认支持集群模式接入,开启cluster-sentinel-enabled参数后,支持哨兵模式接入。开启cluster-sentinel-enabled参数(配置为yes)的操作,请参考修改DCS实例配置参数。 Redis 3.0实例不支持哨兵模式接入。 父主题: 安全性
  • 本地环境是否可以连接缓存实例? 未开启公网访问的DCS缓存实例,本地环境不能直接连接DCS缓存实例。云服务采用虚拟私有云(VPC)管理各服务的网络安全,用户创建的DCS缓存实例,只允许被与实例网络互通的虚拟私有云的弹性云服务器访问。 用户可以通过网络代理转发的方式,用一台能与DCS缓存实例网络互通的弹性云服务器(ECS)做中转,实现本地环境连接DCS缓存实例。具体操作参考使用SSH隧道代理机制实现公网访问DCS实例。 已开启公网访问的缓存实例,可以通过本地环境连接DCS缓存实例。 父主题: 客户端和网络连接
  • Redis的安全加固方面有哪些建议? 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,但是原生Redis版本在安全方面非常薄弱,很多地方不满足安全要求,如果暴露在公网上,极易受到恶意攻击,导致数据泄露和丢失。 针对DCS的Redis实例,您在使用过程中,可参考如下建议: 网络连接配置 敏感 数据加密 后存储在Redis实例,且实例不开启公网访问。 对于敏感数据,尽量加密后存储。如无特殊需要,尽量不使用公网访问。 对安全组设置有限的、必须的允许访问规则。 安全组与VPC均是用于网络安全访问控制的配置,以端口最少放开原则配置安全组规则,降低网络入侵风险。 客户端应用所在ECS设置防火墙。 客户端应用所在的服务器建议配置防火墙过滤规则。 设置实例访问密码。 配置实例白名单。 Redis-cli使用 隐藏密码 安全问题:通过在redis-cli指定-a参数,密码会被ps出来,属于敏感信息。 解决方案:修改Redis源码,在main方法进入后,立即隐藏掉密码,避免被ps出来。 禁用脚本通过sudo方式执行 安全问题: redis-cli访问参数带密码敏感信息,会被ps出来,也容易被系统记录操作日志。 解决方案:改为通过API方式(Python可以使用redis-py)来安全访问,禁止通过sudo方式切换到dbuser账号使用redis-cli。 父主题: 安全性
  • Redis 3.0 Proxy集群不支持redisson分布式锁的原因 redisson分布式锁的加锁和解锁流程如下: redisson分布式锁的加锁和解锁都是执行一段lua脚本功能实现的。 在加锁阶段,需要在lua脚本中执行exists、hset、pexpire、hexists、hincrby、pexpire、pttl命令。 在解锁阶段,需要在lua脚本中执行exists、publish、hexists、pexpire、del命令。 由于Proxy集群支持publish/subscribe(redis的发布订阅)时,是需要在Proxy节点上识别publish/subscribe命令,做一些特殊处理(转发给所有redis-server的节点),因此不支持直接在lua脚本中执行publish命令。 因此,Redis 3.0 Proxy集群无法支持redisson的分布式锁机制,如果需要使用redisson分布式锁功能,建议使用Redis 4.0或Redis 5.0集群。 父主题: Redis使用
  • 实例无法删除是什么原因? 可能原因如下: 实例资源为包周期实例。 包周期的实例不支持删除操作,界面没有“删除”按钮,用户需要执行“退订”操作,退订实例资源。 实例状态不是“运行中”。 只有当实例处于“运行中”状态,才能执行删除操作。 确认实例是否为创建失败的实例。 单击缓存实例列表上方“创建失败的实例”后的图标或者数量,如果是创建失败的实例,会显示在弹出的“创建失败的实例”窗口中,请从该界面中进行删除。 父主题: Redis使用
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全