Redis命令性能优化及事务使用过程(上)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis命令性能优化及事务使用过程(上)

场景


假设有这样一个使用场景,依次执行下面的5条命令 
命令1:hset mall:sale:freq:ctrl:860000000000001 599055114591 1(hash结构,field表示购买的商品ID,value表示购买次数)
简单说明:mall:sale:freq:ctrl:860000000000001是一个hash表;599055114591表示key;1表示key对应的value
命令2:hset mall:sale:freq:ctrl:860000000000001 599055114592 2
命令3:expire mall:sale:freq:ctrl:860000000000001 3127(设置过期时间)
简单说明:给hash表mall:mall:sale:freq:ctrl:860000000000001设置过期时间
命令4:set mall:total:freq:ctrl:860000000000001 3
简单说明:set key vlaue
命令5:expire mall:total:freq:ctrl:860000000000001 3127(设置过期时间)
简单说明: set key 过期时间


优化缘由


执行一条命令 经历的过程


  • 发送命令网络传输时间
  • 命令在Redis服务端队列中等待的时间
  • 命令执行的时间(Redis中的slowlog只是检测这一步骤的时间)
  • 结果返回的Redis客户端的时间


image.png


执行一条命令 就需要经过上面的过程,发送命令-〉命令排队-〉命令执行-〉返回结果
那么执行5条命令,可想而知,性能优化的空间还是蛮大的,
下面咱们来进行优化一下吧


优化


第一次优化:利用hmset命令将两条hmset命令合二为一


命令1和命令2 合二为一
hmset mall:sale:freq:ctrl:860000000000001 599055114591 1 599055114592 2
expire mall:sale:freq:ctrl:860000000000001 3127
set mall:total:freq:ctrl:860000000000001 3
expire mall:total:freq:ctrl:860000000000001 3127


第二次优化:将set和expire命令合二为一


将命令4和命令5合二为一
命令a:hmset mall:sale:freq:ctrl:860000000000001 599055114591 1 599055114592 2
命令b: expire mall:sale:freq:ctrl:860000000000001 3127
命令c: setex mall:total:freq:ctrl:860000000000001 3127 3



第三次优化:使用pipeline


需要注意:RedisCluster中使用pipeline时必须满足pipeline打包的所有命令key在RedisCluster的同一个slot上


分析下是否在同一个slot上


slot原理简介


Redis 集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分哈希槽。 
举个例子, 一个集群可以有三个哈希槽, 其中:
节点 A 负责处理 0 号至 5500 号哈希槽。
节点 B 负责处理 5501 号至 11000 号哈希槽。
节点 C 负责处理 11001 号至 16384 号哈希槽。
这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。 比如说:
如果用户将新节点 D 添加到集群中, 那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
与此类似, 如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。
因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞, 所以无论是添加新节点还是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会造成集群下线。

结论


由此可知 命令a和命令b在同一个slot上,命令c在另外一个slot上
所以命令a和命令b用pipline来处理


如何使用pipline


  • 先创建一个txt文件


vim pipeline.txt
hmset mall:sale:freq:ctrl:860000000000001 599055114591 1 599055114592 2
expire mall:sale:freq:ctrl:860000000000001 3127


  • 格式化 使得 这个文本文件中每一行都必须以\r\n而不是\n结束


需要安装下dos2unix


a、brew install dos2unix


image.png


第四次优化 使用 高级特性:hashtag


CRC16(key) % 16384 来计算键 key 属于哪个槽 可知,key决定了存储在哪个slot上,那么使用hashtag可以使得 满足部分key一致的所有key都存储在同一个slot上

比如


mall:sale:freq:ctrl:{860000000000001} 只要key中有{860000000000001}这一部分,就一定落在同一个slot上


image.png


**注意:使用hashtag特性 不能把key的离散性变得非常差 **


  • 离散性好


mall:sale:freq:ctrl:{860000000000001} 这种key还是与用户相关


  • 离散性差


mall:{sale:freq:ctrl}:860000000000001
所有的key都会落在同一个slot上,导致整个Redis集群出现严重的倾斜问题


经过这4次优化 perfect ==> 5条Redis命令压缩到3条Redis命令,并且3条Redis命令只需要发送一次,并且结果也一次就能全部返回

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
23天前
|
缓存 NoSQL Redis
Redis 事务
10月更文挑战第18天
24 1
|
1月前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
42 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
9天前
|
存储 NoSQL Java
Redis命令:列表模糊删除详解
通过本文的介绍,我们详细探讨了如何在Redis中实现列表的模糊删除。虽然Redis没有直接提供模糊删除命令,但可以通过组合使用 `LRANGE`和 `LREM`命令,并在客户端代码中进行模糊匹配,来实现这一功能。希望本文能帮助你在实际应用中更有效地操作Redis列表。
18 0
|
1月前
|
缓存 NoSQL 测试技术
Redis如何解决频繁的命令往返造成的性能瓶颈!
Redis如何解决频繁的命令往返造成的性能瓶颈!
|
1月前
|
SQL 分布式计算 NoSQL
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
24 2
|
1月前
|
缓存 NoSQL Redis
Redis命令:列表模糊删除详解
Redis命令:列表模糊删除详解
43 3
|
1月前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
190 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
26天前
|
NoSQL Redis 数据安全/隐私保护
Redis 命令
10月更文挑战第15天
25 0
|
2月前
|
监控 NoSQL Redis
redis-server --service-install redis.windows.conf --loglevel verbose 命令的作用是什么?
redis-server --service-install redis.windows.conf --loglevel verbose 命令的作用是什么?
97 3
|
2月前
|
监控 NoSQL 关系型数据库
9)Redis 居然也有事务
9)Redis 居然也有事务
32 0