-
Redis事务概念Redis事务和MySQL的事务在概念上是类似的,都是把一系列操作绑定成一组,让这一组能够批量执行。但是,Redis事务和MySQL事务在特性上有所不同,Redis事务没有回滚机制,只能保证这些操作批量执行,不能做到“一个失败就恢复到初始状态”。Redis 事务本质上是在服务器上搞了⼀个 "事务队列". 每次客⼾端在事务中进⾏⼀个操作, 都会把命令先发给服务器, 放到 "事务队列" 中(但是并不会⽴即执⾏)⽽是会在真正收到 EXEC 命令之后, 才真正执⾏队列中的所有操作. 特性1.弱化的原子性:Redis事务中的所有命令都会序列化、按顺序地执行,执行过程中不会被其他客户端的命令请求打断。但是,Redis事务没有回滚机制。如果事务中的某个命令执行失败,其他命令仍然会继续执行,事务不会因为一个命令的失败而回滚到初始状态。2.不保证一致性:由于Redis事务没有回滚机制,且没有涉及“约束”,因此事务执行过程中如果某个修改操作出现失败,就可能引起不一致的情况。3.不需要隔离性:Redis是单线程处理请求的,因此不需要隔离级别,也不会并发执行事务。4.不需要持久性:Redis事务是保存在内存中的,是否开启持久化是redis-server自己的事情,和事务无关。常用命令MULTI功能:开启一个事务。执行成功返回OK。当开启事务后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中。当EXEC命令被调用时,所有队列中的命令才会被执行。EXEC功能:真正执行事务。每次添加一个操作,都会提示“QUEUED”,说明命令已经进入服务端的队列。当执行EXEC命令时,服务器才会真正执行这些命令。EXEC命令的回复是一个数组,数组中的每个元素都是执行事务中的命令所产生的回复。回复元素的先后顺序和命令发送的先后顺序一致。DISCARD功能:放弃当前事务。直接清空事务队列,之前的操作都不会真正执行。WATCH一定要在开启事务之前使用!!!功能:监控一个或多个键。当开启事务时,如果对WATCH的键进行修改(在EXEC命令执行之前),就会记录当前键的“版本号”。在真正提交事务时(执行EXEC命令时),如果发现当前服务器上的键的版本号已经超过了事务开始时的版本号,就会让事务执行失败。WATCH命令本质上是给EXEC加了个判定条件,属于“乐观锁”。UNWATCH功能:取消对键的监控。相当于WATCH的逆操作。使用演示没开启事务,一方修改,另一方能实时看到 开启事务,一方修改,另一方看不到,直到事务执行完毕 开启事务,一方修改,另一方针对同一Key修改,最终value为执行事务设置的value WATCH只能在开启事务前使用 使用WATCH,开启事务,在事务中修改Key之前,Key被修改,在事务中修改Key,当执行EXEC会提示(nil),Key的value依旧是另一方设置的value 使用场景Redis事务适用于需要把多个操作打包进行的情况。例如,在商品抢购场景中,如果使用Redis事务,可以避免多线程下的线程安全问题。通过Redis事务,可以确保一系列操作(如检查库存、扣减库存等)的原子性执行,从而避免数据不一致的问题。注意事项1.锁的释放:在使用WATCH命令进行乐观锁控制时,需要注意在事务执行完毕后及时释放锁(即取消对键的监控)。如果忘记释放锁或因为异常导致锁无法释放,则可能会导致死锁问题。2.事务的失败处理:由于Redis事务没有回滚机制,因此需要在设计业务逻辑时考虑到事务失败的处理方式。例如,可以通过检查命令的返回值来判断命令是否执行成功,并采取相应的处理措施。3.避免事务过大:如果事务过大(包含过多的命令),可能会导致Redis服务器的性能下降。因此,需要合理控制事务的大小,避免将过多的命令放入一个事务中执行。———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/wmh_1234567/article/details/142964936
-
ZADD添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负极限也是合法的。语法ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]ZADD 的相关选项:• XX:仅仅⽤于更新已经存在的元素,不会添加新元素。• NX:仅⽤于添加新元素,不会更新已经存在的元素。• CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。• INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。时间复杂度:O(log(N))返回值:本次添加成功的元素个数。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 1 "uno"(integer) 1redis> ZADD myzset 2 "two" 3 "three"(integer) 2redis> ZRANGE myzset 0 -1 WITHSCORES1) "one"2) "1"3) "uno"4) "1"5) "two"6) "2"7) "three"8) "3"ZCARD获取⼀个 zset 的基数(cardinality),即 zset 中的元素个数。语法ZCARD key时间复杂度:O(1)返回值:zset 内的元素个数。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 2 "two"(integer) 1redis> ZCARD myzset(integer) 2ZCOUNT返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。语法ZCOUNT key min max时间复杂度:O(log(N))返回值:满⾜条件的元素列表个数。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 2 "two"(integer) 1redis> ZADD myzset 3 "three"(integer) 1redis> ZCOUNT myzset -inf +inf(integer) 3redis> ZCOUNT myzset (1 3(integer) 2ZRANGE返回指定区间⾥的元素,分数按照升序。带上 WITHSCORES 可以把分数也返回。语法ZRANGE key start stop [WITHSCORES]时间复杂度:O(log(N)+M)返回值:区间内的元素列表。举例redis> ZADD myzset 1 "one" 2 "two" 3 "three"(integer) 3redis> ZRANGE myzset 0 -11) "one"2) "two"3) "three"redis> ZRANGE myzset 2 31) "three"redis> ZRANGE myzset -2 -11) "two"2) "three"ZREVRANGE返回指定区间⾥的元素,分数按照降序。带上 WITHSCORES 可以把分数也返回。语法ZREVRANGE key start stop [WITHSCORES]时间复杂度:O(log(N)+M)返回值:区间内的元素列表。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 2 "two"(integer) 1redis> ZADD myzset 3 "three"(integer) 1redis> ZREVRANGE myzset 0 -11) "three"2) "two"3) "one"redis> ZREVRANGE myzset 2 31) "one"redis> ZREVRANGE myzset -2 -11) "two"2) "one"ZRANGEBYSCORE返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。语法ZRANGEBYSCORE key min max [WITHSCORES]时间复杂度:O(log(N)+M)返回值:区间内的元素列表。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 2 "two"(integer) 1redis> ZADD myzset 3 "three"(integer) 1redis> ZRANGEBYSCORE myzset -inf +inf1) "one"2) "two"3) "three"redis> ZRANGEBYSCORE myzset 1 21) "one"2) "two"redis> ZRANGEBYSCORE myzset (1 21) "two"redis> ZRANGEBYSCORE myzset (1 (2(empty array)ZPOPMAX删除并返回分数最⾼的 count 个元素。语法ZPOPMAX key [count]时间复杂度:O(log(N) * M)返回值:分数和元素列表。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 2 "two"(integer) 1redis> ZADD myzset 3 "three"(integer) 1redis> ZPOPMAX myzset1) "three"2) "3"BZPOPMAXZPOPMAX 的阻塞版本。语法BZPOPMAX key [key ...] timeout时间复杂度:O(log(N))返回值:元素列表。举例redis> DEL zset1 zset2(integer) 0redis> ZADD zset1 0 a 1 b 2 c(integer) 3redis> BZPOPMAX zset1 zset2 01) "zset1"2) "c"3) "2"ZPOPMIN删除并返回分数最低的 count 个元素。语法ZPOPMIN key [count]时间复杂度:O(log(N) * M)返回值:分数和元素列表。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 2 "two"(integer) 1redis> ZADD myzset 3 "three"(integer) 1redis> ZPOPMIN myzset1) "one"2) "1"BZPOPMINZPOPMIN 的阻塞版本。语法BZPOPMIN key [key ...] timeout时间复杂度:O(log(N))返回值:元素列表。举例redis> DEL zset1 zset2(integer) 0redis> ZADD zset1 0 a 1 b 2 c(integer) 3redis> BZPOPMIN zset1 zset2 01) "zset1"2) "a"3) "0"ZRANK返回指定元素的排名,升序。语法ZRANK key member时间复杂度:O(log(N))返回值:排名。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 2 "two"(integer) 1redis> ZADD myzset 3 "three"(integer) 1redis> ZRANK myzset "three"(integer) 2redis> ZRANK myzset "four"(nil)redis> ZRANK myzset "three" WITHSCORE1) (integer) 22) "3"redis> ZRANK myzset "four" WITHSCORE(nil)ZREVRANK返回指定元素的排名,降序。语法ZREVRANK key member时间复杂度:O(log(N))返回值:排名。redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 2 "two"(integer) 1redis> ZADD myzset 3 "three"(integer) 1redis> ZREVRANK myzset "one"(integer) 2redis> ZREVRANK myzset "four"(nil)redis> ZREVRANK myzset "three" WITHSCORE1) (integer) 02) "3"redis> ZREVRANK myzset "four" WITHSCORE(nil)ZSCORE返回指定元素的分数。语法ZSCORE key member时间复杂度:O(1)返回值:分数。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZSCORE myzset "one""1"ZREM删除指定的元素。语法ZREM key member [member ...]时间复杂度:O(M*log(N))返回值:本次操作删除的元素个数。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 2 "two"(integer) 1redis> ZADD myzset 3 "three"(integer) 1redis> ZREM myzset "two"(integer) 1redis> ZRANGE myzset 0 -1 WITHSCORES1) "one"2) "1"3) "three"4) "3"ZREMRANGEBYRANK按照排序,升序删除指定范围的元素,左闭右闭。语法ZREMRANGEBYRANK key start stop时间复杂度:O(log(N)+M)返回值:本次操作删除的元素个数。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 2 "two"(integer) 1redis> ZADD myzset 3 "three"(integer) 1redis> ZREMRANGEBYRANK myzset 0 1(integer) 2redis> ZRANGE myzset 0 -1 WITHSCORES1) "three"2) "3"ZREMRANGEBYSCORE按照分数删除指定范围的元素,左闭右闭。语法ZREMRANGEBYSCORE key min max时间复杂度:O(log(N)+M)返回值:本次操作删除的元素个数。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 2 "two"(integer) 1redis> ZADD myzset 3 "three"(integer) 1redis> ZREMRANGEBYSCORE myzset -inf (2(integer) 1redis> ZRANGE myzset 0 -1 WITHSCORES1) "two"2) "2"3) "three"4) "3"ZINCRBY为指定的元素的关联分数添加指定的分数值。语法ZINCRBY key increment member时间复杂度:O(log(N))返回值:增加后元素的分数。举例redis> ZADD myzset 1 "one"(integer) 1redis> ZADD myzset 2 "two"(integer) 1redis> ZINCRBY myzset 2 "one""3"redis> ZRANGE myzset 0 -1 WITHSCORES1) "two"2) "2"3) "one"4) "3"ZINTERSTORE求出给定有序集合中元素的交集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。语法ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]时间复杂度:O(N*K)+O(M*log(M)) N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了⼏个有序集合; M 是最终结果的有序集合的元素个数.返回值:⽬标集合中的元素个数。举例redis> ZADD zset1 1 "one"(integer) 1redis> ZADD zset1 2 "two"(integer) 1redis> ZADD zset2 1 "one"(integer) 1redis> ZADD zset2 2 "two"(integer) 1redis> ZADD zset2 3 "three"(integer) 1redis> ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3(integer) 2redis> ZRANGE out 0 -1 WITHSCORES1) "one"2) "5"3) "two"4) "10"ZUNIONSTORE求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。语法ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]时间复杂度:O(N)+O(M*log(M)) N 是输⼊的有序集合总的元素个数; M 是最终结果的有序集合的元素个数.返回值:⽬标集合中的元素个数。举例redis> ZADD zset1 1 "one"(integer) 1redis> ZADD zset1 2 "two"(integer) 1redis> ZADD zset2 1 "one"(integer) 1redis> ZADD zset2 2 "two"(integer) 1redis> ZADD zset2 3 "three"(integer) 1redis> ZUNIONSTORE out 2 zset1 zset2 WEIGHTS 2 3(integer) 3redis> ZRANGE out 0 -1 WITHSCORES1) "one"2) "5"3) "three"4) "9"5) "two"6) "10"内部编码有序集合类型的内部编码有两种:• ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个),同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。• skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时ziplist 的操作效率会下降。1)当元素个数较少且每个元素较⼩时,内部编码为 ziplist:127.0.0.1:6379> zadd zsetkey 50 e1 60 e2 30 e3(integer) 3127.0.0.1:6379> object encoding zsetkey"ziplist"2)当元素个数超过 128 个,内部编码 skiplist:127.0.0.1:6379> zadd zsetkey 50 e1 60 e2 30 e3 ... 省略 ... 82 e129(integer) 129127.0.0.1:6379> object encoding zsetkey"skiplist"3)当某个元素⼤于 64 字节时,内部编码 skiplist:127.0.0.1:6379> zadd zsetkey 50 "one string bigger than 64 bytes ... 省略 ..."(integer) 1127.0.0.1:6379> object encoding zsetkey"skiplist”应用场景1.排行榜Zset非常适合用于实现各种排行榜,如游戏内的玩家排名、社交平台的热门帖子排名等。元素可以是玩家的ID或帖子的ID,分数可以是玩家的积分或帖子的点赞数、评论数等。可以使用ZRANGE或ZREVRANGE命令来获取排名前列的元素,或使用ZRANK或ZREVRANK命令来获取特定元素的排名。2.延时队列Zset可以用于实现延时队列,其中元素代表任务,分数代表任务的执行时间戳。通过定期检查Zset中分数最小的元素(即最早应该执行的任务),可以实现任务的定时执行。当任务执行后,可以从Zset中删除该元素。———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/wmh_1234567/article/details/144493484
-
Redis集群是Redis的分布式解决方案,旨在通过多个节点共同工作来提高Redis的稳定性和效率。以下是对Redis集群的详细介绍:一、定义与目的Redis集群通过添加服务器的数量提供相同的服务,从而让服务器达到一个稳定、高效的状态。它主要解决单个Redis实例存在的不稳定性、读写能力有限以及存储容量受限等问题。二、特性可扩展性:Redis集群最多可扩展到1000个节点上,这极大地提高了Redis数据库的可扩展性。可用性:Redis集群继续运行有两个条件,即大多数主节点必须可达,无法达到的主节点必须有一个备份从节点。这一特性有助于提高Redis数据库的可用性。写入安全性:Redis集群尝试以写入安全的方式运行,它将尽量保留与集群中多数主节点连接的任何客户端的写入。数据分片:Redis集群通过在数据库中分片数据来工作。分片是一种数据库分区方案,将数据库中不同的行(在Redis中是键值对)分布到多个节点上,以便每个节点包含一部分数据。这意味着如果一个节点宕机,只有一部分数据将不可用,这将允许许多数据库请求正常进行。主/从架构:Redis集群使用主从复制,以便集群中的每个主节点都有一个备份从节点。如果其中一个主节点失败,相应的从节点可以被指定为新的主节点,对整个集群的影响很小。三、工作原理Redis集群通过哈希槽(Hash Slot)机制实现数据分片存储。每个节点负责一部分哈希槽,当客户端请求数据时,Redis会根据数据的键计算哈希值,并确定该数据所属的哈希槽,然后将请求转发到负责该哈希槽的节点。四、搭建与配置搭建Redis集群需要准备多台服务器或虚拟机,并在每台服务器上安装Redis。然后,为每个节点创建一个独立的配置目录和配置文件,设置集群相关的参数,如cluster-enabled、cluster-config-file、cluster-node-timeout等。最后,使用redis-cli工具创建集群,并将节点之间的关系绑定起来。五、高可用性保障Redis集群的高可用性主要由以下几个方面保障:自动故障转移:当主节点发生故障时,集群会自动提升对应的从节点为新的主节点,保证服务持续可用。数据分片:通过哈希槽机制,数据分散存储在多个节点上,避免单点瓶颈。去中心化架构:Redis集群中没有单点故障,每个节点相互通讯,共同维护集群状态。六、应用场景Redis集群适用于需要高并发、高可用性和大数据存储的分布式系统。例如,热点数据的缓存、限时任务、计数器、分布式锁、排行榜、社交网站的基本功能(如点赞、踩、关注/被关注、共同好友等)以及队列操作等场景都可以使用Redis集群来实现。综上所述,Redis集群是一种高效、可扩展且高可用的分布式数据库解决方案。它通过数据分片、主/从架构和自动故障转移等机制,提供了稳定、可靠的数据存储和服务。
-
当然,Redis 分布式锁是一种常用的解决分布式系统中资源同步访问的方法。以下是一篇关于 Redis 分布式锁的详细指南,包括原理、实现以及注意事项。Redis 分布式锁详解一、引言在分布式系统中,多个进程或线程可能会同时访问和修改共享资源,这会导致数据不一致的问题。为了解决这一问题,分布式锁应运而生。Redis 分布式锁因其高性能和易用性,成为了一种广泛使用的解决方案。二、Redis 分布式锁的原理Redis 分布式锁的实现通常依赖于 Redis 的单线程模型和原子操作。常见的实现方式包括使用 SETNX 命令、SET 命令的 NX 和 EX 选项,以及基于 Lua 脚本的原子操作。2.1 SETNX 命令SETNX 是 Redis 中的一个命令,全称是 “SET if Not eXists”。它用于设置一个键值对,当且仅当该键不存在时才会成功设置,并返回 1;如果键已经存在,则设置失败,返回 0。利用这一特性,我们可以实现一个简单的分布式锁。2.2 SET 命令的 NX 和 EX 选项Redis 2.6.12 版本及以后,SET 命令增加了 NX 和 EX 选项。NX 表示仅在键不存在时设置键,EX 表示设置键的过期时间。通过这两个选项,我们可以一次性完成锁的获取和过期时间的设置,从而简化了分布式锁的实现。2.3 Lua 脚本为了确保分布式锁的原子性,可以使用 Lua 脚本来实现复杂的操作。Lua 脚本在 Redis 中是以原子方式执行的,这保证了脚本中的多个命令在执行过程中不会被其他命令打断。三、Redis 分布式锁的实现以下是一个基于 Redis SET 命令的 NX 和 EX 选项实现的分布式锁示例:3.1 锁获取import redis import uuid import time # 连接到 Redis 服务器 client = redis.StrictRedis(host='localhost', port=6379, db=0) def acquire_lock(lock_name, acquire_timeout=10, lock_timeout=10): identifier = str(uuid.uuid4()) end = time.time() + acquire_timeout while time.time() < end: if client.set(lock_name, identifier, nx=True, px=lock_timeout * 1000): return identifier time.sleep(0.001) return False 在这个示例中,acquire_lock 函数尝试获取一个名为 lock_name 的锁。它生成一个唯一的标识符 identifier,并使用 SET 命令的 NX 和 PX 选项尝试设置锁。如果设置成功,则返回标识符;否则,循环等待直到超时。3.2 锁释放def release_lock(lock_name, identifier): pipe = client.pipeline(True) while True: try: pipe.watch(lock_name) if pipe.get(lock_name) == identifier: pipe.multi() pipe.delete(lock_name) pipe.execute() return True pipe.unwatch() break except redis.exceptions.WatchError: continue return False 在 release_lock 函数中,我们使用 Redis 的事务机制来确保锁的正确释放。通过 WATCH 命令监视锁键,如果锁键的值与我们的标识符匹配,则使用 MULTI 和 EXEC 命令删除锁键。如果在事务执行过程中锁键被其他进程修改,则会引发 WatchError 异常,此时我们重新尝试释放锁。四、注意事项锁过期时间:设置合理的锁过期时间非常重要。如果过期时间太短,可能会导致锁被意外释放;如果过期时间太长,则可能导致资源被长时间占用。续期机制:对于需要长时间持有的锁,可以考虑实现续期机制,即在锁即将过期时重新设置过期时间。这需要在业务逻辑中增加相应的处理。可重入性:上述示例中的锁实现是不可重入的。如果需要可重入锁,可以在锁值中记录获取锁的次数,并在释放锁时根据次数递减。锁释放失败:由于网络或其他原因,锁可能无法被正确释放。为了避免这种情况,可以使用额外的机制(如日志记录、监控等)来检测和清理未释放的锁。Redis 实例的高可用性:如果 Redis 实例发生故障,可能会导致分布式锁失效。因此,在生产环境中,通常需要使用 Redis 集群或主从复制来提高 Redis 的可用性。五、总结Redis 分布式锁是一种高效且易用的解决方案,适用于大多数分布式系统中的资源同步访问场景。通过合理设置锁过期时间、实现续期机制以及注意锁的释放和可重入性等问题,可以确保分布式锁的正确性和可靠性。希望这篇指南对你理解和实现 Redis 分布式锁有所帮助。如果你有任何问题或需要进一步的帮助,请随时提问。
-
用到了华为redis客户端,版本是jedisclient-3.6.3-h0.cbu.mrs.330.r9.jar创建客户端实例JedisCluster,本地和服务器上链接正常,使用docker创建镜像后,只有少数情况下正常,多数情况下都需要16秒才能创建,跟踪代码定位发现在JdisAuth.java中createSaslClient里调用Sasl.createSaslClient需要16秒,jdk换成和服务器正常使用的jdk一样也不行,怀疑可能是网络问题,各位有没有遇到相似问题的,麻烦提供一下指点,非常感谢
-
redis全量+增量迁移(已经在增量中),发现目标实例键数>源实例键数,这是什么情况呢
-
#实惠更实用,跑赢新开局 #华为云618 15+款云原生2.0产品助力应用现代化! Redis、Kafka、RockeMQ、研发工具等新客试用3.96元起 老客户也有专属优惠!下单抽FreeBuds耳机! 更多产品优惠戳:http://t.cn/A6a7JhLQ #华为云 #618促销季
-
#华为云开年采购季#15+云原生产品全场低至3折,新客1.98元起! -Redis低至6折,Kafka、RabbitMQ、RocketMQ等低至5.5折,3年5折! -数字资产链新客119元起,华为链新客19.8元起! -软件开发生产线CodeArts,新客试用1.98元起! -漏洞扫描、二进制成分分析、APP合规检测6.6折起! -Serverless应用引擎CAE,新客试用109元起! -ROMAConnect集成平台,打通新老应用,试用19.8元起! 下单抽FreeBuds无线耳机!更多产品优惠戳:http://t.cn/A6a7JhLQ 活动有效期至2023年3月31日,上云正当时!>点击这里,马上进入活动专场<
-
分布式缓存服务(Distributed Cache Service,简称DCS)是华为云提供的一款内存数据库服务,兼容了Redis和Memcached两种内存数据库引擎,为您提供即开即用、安全可靠、弹性扩容、便捷管理的在线分布式缓存能力,满足用户高并发及数据快速访问的业务诉求。即开即用DCS提供单机、主备、Proxy集群、Cluster集群、读写分离类型的缓存实例,拥有从128M到1024G的丰富内存规格。您可以通过控制台直接创建,无需单独准备服务器资源。其中Redis 4.0、Redis 5.0和Redis 6.0版本采用容器化部署,秒级完成创建。安全可靠借助华为云统一身份认证、虚拟私有云、云监控与云审计等安全管理服务,全方位保护实例数据的存储与访问。灵活的容灾策略,主备/集群实例从单AZ(可用区)内部署,到支持跨AZ部署。弹性伸缩DCS提供对实例内存规格的在线扩容与缩容服务,帮助您实现基于实际业务量的成本控制,达到按需使用的目标。便捷管理可视化Web管理界面,在线完成实例重启、参数修改、数据备份恢复等操作。DCS还提供基于RESTful的管理API,方便您进一步实现实例自动化管理。在线迁移提供可视化Web界面迁移功能,支持备份文件导入和在线迁移两种方式,您可以通过控制台直接创建迁移任务,提高迁移效率。 以下是我们整理的DCS相关资料:分布式缓存服务DCS产品官方文档最新动态_分布式缓存服务 DCS_华为云 (huaweicloud.com)分布式缓存服务DCS功能总览功能总览_分布式缓存服务 DCS_华为云 (huaweicloud.com)分布式缓存服务DCS快速入门快速入门_分布式缓存服务 DCS_华为云 (huaweicloud.com)分布式缓存服务DCS用户指南管理和使用分布式缓存服务_分布式缓存服务 DCS_用户指南_使用前必读_华为云 (huaweicloud.com)分布式缓存服务DCS API参考概述_分布式缓存服务 DCS_API参考_使用前必读_华为云 (huaweicloud.com)华为云分布式缓存服务Redis(DCS),从入门到实践应用,循序渐进一站式学习Redis全景实践课_在线课程_华为云开发者学堂_云计算培训-华为云 (huaweicloud.com)
-
#华为云12·12#全场DevOps与中间件服务3折起,新用户1.98元起,老用户续订7折起!-Redis、Kafka、RabbitMQ、RocketMQ等低至5.5折,3年5折!-数字资产链7折起,区块链新客试用19.8元起!-软件开发生产线CodeArts,新客试用1.98元起!-漏洞扫描、二进制成分分析、APP合规检测6.6折起!下单抽FreeBuds无线耳机!戳连接:http://t.cn/A6a7JhLQ活动有效期至2022年12月31日,上云正当时!>点击这里,马上进入活动专场<
-
828选华为云,实惠更实用!研发与中间件专场全场3折起! Redis、Kafka、数字资产链、软件开发平台,首购低至1.98元! 下单抽FreeBuds耳机,满额送P50手机,助力企业转型云原生2.0! 活动有效期至2022年9月16日,上云正当时!>点击这里,马上进入活动专场<
-
亲爱的开发者们,618年中钜惠来袭!参与试用,100%有礼!最高可得价值899元FreeBuds耳机,满额再送MateBook笔记本!>点击这里,马上进入活动专场<
-
【背景】新业务上云,需要获取环境中的redis 5.0 proxy 64G集群在GET以及SET命令操作下的性能指标。 【测试目标】测试redis 5.0 proxy 64G集群服务在1000并发访问下,集群的QPS能否达到100000【环境准备】硬件环境准备服务器数量可用区用途通用计算增强型 | c6.xlarge.2 | 4核 | 8GB3华北 北京四 可用区1测试机安装测试软件Redis 5.0 proxy 64G集群1华北 北京四 可用区1被测机提供被测环境测试软件安装(基于Centos 7.5安装)注:需在每台测试机器安装redis-benchmark客户端测试工具,DCS 4.0 cluster以及DCS cluster 5.0集群需使用memtier_benchmark测试工具,使用redis-benchmark时只能测试到一个节点。其余DCS实例的均可使用redis-benchmark测试工具。1. 安装步骤$ wget http://download.redis.io/releases/redis-5.0.8.tar.gz $ tar xzf redis-5.0.8.tar.gz $ cd redis-5.0.8/src $ make 2. 命令格式[root@testceph ~]# redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests>] [-r <keyspacelen>] [-t <tests>]参数解释:-h <hostname>服务器的主机名(默认值为127.0.0.1)-p <port>服务器的端口号(默认值为6379)-s <socket>服务器的套接字(会覆盖主机名和端口号)-a <password>登录Redis时进行身份验证的密码。-c <clients>并发的连接数量(默认值为50)-n <requests>发出的请求总数(默认值为100000)-d <size>SET/GET命令所操作的值的数据大小,以字节为单位(默认值为2)–dbnum <db>选择用于性能测试的数据库的编号(默认值为0)-r <keyspacelen>随机键个数-t <tests>测试的命令【环境拓扑】 【测试场景】场景场景描述测试命令检查点场景1使用1个客户端,总并发数为1000,总请求数为10000000,使用1000000个随机键,操作的数据大小为32字节,操作的命令为SET和GET./redis-benchmark -h 集群地址 -p 6379 -a 密码 -c 1000 -n 10000000 -r 1000000 -d 32 -t SET,GET分别查看SET以及GET下的QPS大小场景2使用2个客户端,总并发数为1000,每个客户端并发数为500,总请求数为10000000,使用1000000个随机键,操作的数据大小为32字节,操作的命令为SET和GET./redis-benchmark –h 集群地址-p 6379 -a密码-c 500 -n 10000000 -r 1000000 -d 32 -t SET,GET分别查看SET以及GET下的QPS大小场景3使用3个客户端,总并发数为1000,每个客户端并发数为334,总请求数为10000000,使用1000000个随机键,操作的数据大小为32字节,操作的命令为SET和GET./redis-benchmark –h 集群地址-p 6379 -a密码-c 334 -n 10000000 -r 1000000 -d 32 -t SET,GET分别查看SET以及GET下的QPS大小场景4使用4个客户端,总并发数为1000,每个客户端并发数为250,总请求数为10000000,使用1000000个随机键,操作的数据大小为32字节,操作的命令为SET和GET./redis-benchmark –h 集群地址-p 6379 -a密码-c 250 -n 10000000 -r 1000000 -d 32 -t SET,GET分别查看SET以及GET下的QPS大小场景5使用6个客户端,总并发数为1000,每个客户端并发数为167,总请求数为10000000,使用1000000个随机键,操作的数据大小为32字节,操作的命令为SET和GET./redis-benchmark –h 集群地址-p 6379 -a密码-c 167 -n 10000000 -r 1000000 -d 32 -t SET,GET分别查看SET以及GET下的QPS大小场景6使用9个客户端,总并发数为1000,每个客户端并发数为111,总请求数为10000000,使用1000000个随机键,操作的数据大小为32字节,操作的命令为SET和GET./redis-benchmark –h 集群地址-p 6379 -a密码-c 111 -n 10000000 -r 1000000 -d 32 -t SET,GET分别查看SET以及GET下的QPS大小【测试结果】按照以上场景,使用3台压测机,分别在不同的客户端数量下进行并发访问,控制总并发数为1000,具体实验数据如下:由上述测试数据可得出,华为云redis 5.0 proxy 64G集群在1000并发下,可以支撑SET的QPS:27W,GET的QPS:28W,完全满足实验目标的QPS:10W。
-
【背景】访问Redis 5.0 cluster集群出现OOM报错,报错信息为(error) OOM command not allowed when used memory > ‘maxmemory’,部分ECS应用程序无法向数据库写入,影响服务的正常使用。执行set t2 s2时,数据库报错OOM,如下图:【拓扑】环境信息:Redis 5.0 cluster集群 4G内存 DCS网段:192.168.1.0/24分片1:master 192.168.1.12 slave 192.168.1.37分片2:master 192.168.1.10 slave 192.168.1.69分片3:master 192.168.1.26 slave 192.168.1.134 【分析思路】【详细步骤】一、查看监控查看Redis实例监控,显示Redis集群内存占用46.97%,无明显异常,结果如下图所示:查看节点的内存监控。其中分片2中master节点192.168.1.10内存使用率达到100%,其余两个分片分内存使用率均在20%左右,结果如下图所示:二、确认异常分片信息通过上述监控信息可得知,该redis集群中的分片2中内存使用率达100%。有且仅有该分片内存异常。三、大KEY分析在线分析① 工具分析:使用华为云管理控制台缓存分析-大Key分析工具。执行完成后,查看信息即可。结果如下图所示:(string类型保存top20,list/set/zset/hash类型保存top80)具体使用方法参考以下链接:https://support.huaweicloud.com/usermanual-dcs/dcs-ug-190808001.html② 命令分析:使用redis-cli -h IP -p port –bigkeys命令,该工具会列出各个类型数据中大Key中的最大的那个key的信息。结果如下图所示:如上图所示,可以得出该环境中string类型的大key为“nc_filed/_pk”,大小为13283byte,list、set、hash、zset类型的数据未发现大key。离线方式离线分析需要使用专门的rdb_bigkeys分析工具,对rdb文件进行分析。工具地址: https://github.com/weiyanwei412/rdb_bigkeys。具体步骤如下:编译方法:# yum install git go -y# mkdir /home/gocode/# cd /home/gocode/# git clone https://github.com/weiyanwei412/rdb_bigkeys.git# cd rdb_bigkeys# go build执行完成生成可执行文件rdb_bigkeys。使用方法: ./rdb_bigkeys -bytes 1024 -file bigkeys.csv -sorted -threads 4 /home/redis/dump.rdb参数说明:-bytes 1024:筛选大于1024字节的key-file bigkeys.csv:将结果保存到bigkeys.csv文件-sorted:从大到小进行排序-threads:使用的线程个数/home/redis/dump.rdb:实际的rdb文件路径生成文件样式如下所示:每列分别为数据库编号,key类型,key名,key大小,元素数量,最大值元素名,元素大小,key过期时间。文档链接:https://www.cnblogs.com/yqzc/p/12425533.html四、解决方案导致本次OOM问题的根因为大KEY导致数据大小分布不均匀,某一个分片内存达到maxmemory,在进行数据写入的过程中,如果调度到该分片,则会产生OOM问题。将该分片的rdb文件导出一份,以便于后期针对大key做对应的优化。临时方案:为尽快回复业务,删除上有步骤中查询到的大KEY,执行操作如下:(非字符串的bigkey,不要使用 del 删除,使用 hscan、sscan、zscan 方式渐进式删除)长期方案:通过对大KEY进行拆分,将一个大的KEY拆分为多个小的KEY, 变成value1,value2… valueN,打散分不到不同的分片中,避免因为数据倾斜导致的数据分布不均。其他的类型的数据也可以按照相同的方式进行拆分重组,从而避免大KEY带来的影响。五、 结果验证查看分片监控,192.168.1.10内存使用率下降到24%,结果如下图所示:执行set t2 s2,返回正常,登录集群,执行get命令,正常返回数据信息。结果如下所示,至此业务恢复正常。 【优化及建议】1) 配置节点级别的内存利用率监控指标的告警。如果某个节点存在大key,这个节点比其他节点内存使用率高很多,会触发告警,便于用户发现潜在的大key。2) 配置节点级别的入网最大带宽、出网最大带宽、CPU利用率监控指标的告警。如果某个节点存在热key,这个节点的带宽占用、CPU利用率都比其他节点高,该节点会容易触发告警,便于用户发现潜在热key。3) string类型控制在10KB以内,hash、list、set、zset元素尽量不超过5000。4) 定期通过大key、热key分析工具检查集群中是否存在大key问题,尽早识别风险。
推荐直播
-
大模型Prompt工程深度实践
2025/02/24 周一 16:00-17:30
盖伦 华为云学堂技术讲师
如何让大模型精准理解开发需求并生成可靠输出?本期直播聚焦大模型Prompt工程核心技术:理解大模型推理基础原理,关键采样参数定义,提示词撰写关键策略及Prompt工程技巧分享。
回顾中 -
华为云 x DeepSeek:AI驱动云上应用创新
2025/02/26 周三 16:00-18:00
华为云 AI专家大咖团
在 AI 技术飞速发展之际,DeepSeek 备受关注。它凭借哪些技术与理念脱颖而出?华为云与 DeepSeek 合作,将如何重塑产品与应用模式,助力企业数字化转型?在华为开发者空间,怎样高效部署 DeepSeek,搭建专属服务器?基于华为云平台,又该如何挖掘 DeepSeek 潜力,实现智能化升级?本期直播围绕DeepSeek在云上的应用案例,与DTSE布道师们一起探讨如何利用AI 驱动云上应用创新。
去报名
热门标签