您现在的位置是:亿华云 > 人工智能
4次优化,我把Redis性能 “压榨” 到极致!
亿华云2025-10-08 21:19:46【人工智能】6人已围观
简介我们有个这样的需求:每天每一个抢购商品只能买一次,并且全场抢购商品总购买次数不允许超过5次。那么,整个商品限购的流程大概如下图所示:那么,在每次购买成功商品成功后,发送的MQ大概是这样的假设当前这笔订
我们有个这样的压榨需求:每天每一个抢购商品只能买一次,并且全场抢购商品总购买次数不允许超过5次次优化那么,到极整个商品限购的压榨流程大概如下图所示:
那么,在每次购买成功商品成功后次优化发送的到极MQ大概是这样的(假设当前这笔订单有两件抢购商品):
[{ "orderId": "2020020622000001", "orderTime": "1581001673012", "productId": "599055114591", "userId": "860000000000001", "merchantCode": "A045" }, { "orderId": "2020020622000001", "orderTime": "1581001673012", "productId": "599055114592", "userId": "860000000000001", "merchantCode": "A045" }]这条消息表示860000000000001这个用户在1581001673012这个时间点(北京时间为2020/02/06 23:07:53)在A045这个商户分别购买了商品ID为599055114591和599055114592两样商品。
那么,压榨当消费这条信息后次优化更新频控的到极几条关键Redis命令如下(上面的需求不是重点,优化下面5条命令才是压榨本文的重点):
命令1:hset mall:sale:freq:ctrl:860000000000001 599055114591 1(hash结构,field表示购买次优化商品ID,value表示购买次数) 命令2:hset mall:sale:freq:ctrl:860000000000001 599055114592 2 命令3:expire mall:sale:freq:ctrl:860000000000001 3127(设置过期时间) 命令4:set mall:total:freq:ctrl:860000000000001 3 命令5:expire mall:total:freq:ctrl:860000000000001 3127(设置过期时间)我们首先了解一下执行一条Redis命令耗时由哪几部分组成:发送命令网络传输时间,到极命令在Redis服务端队列中等待的压榨时间,命令执行次优化时间(Redis中的slowlog只是检测这一步骤的时间),结果返回的到极Redis客户端的时间。如下图所示:
上面的业务总计涉及5条Redis命令,每条命令都需要经过这些步骤,可想而知性能真的弱爆了(可能整个执行过程还不需要10ms,但还是源码库弱爆了)。
第1次优化第一次优化非常简单,稍微有点经验就能看出来,利用hmset命令将两条hmset命令合二为一,优化后的Redis命令如下:
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 第2次优化第二次优化将set和expire命令合二为一,这个一般对Redis有点了解的也知道如何优化:
hmset mall:sale:freq:ctrl:860000000000001 599055114591 1 599055114592 2 expire mall:sale:freq:ctrl:860000000000001 3127 setex mall:total:freq:ctrl:860000000000001 3127 3 第3次优化第3次优化需要借助pipeline,简直就是Redis优化的一大杀器。不过,需要注意的是在RedisCluster中使用pipeline时必须满足pipeline打包的所有命令key在RedisCluster的同一个slot上。如果打包命令的key不在同一个slot上,就会报错。所以我们需要分两批打包:
-- 这两条命令的key都是一样的,肯定在同一个slot上 pipeline( hmset mall:sale:freq:ctrl:860000000000001 599055114591 1 599055114592 2 expire mall:sale:freq:ctrl:860000000000001 3127 ) -- mall:total:freq:ctrl:860000000000001和mall:sale:freq:ctrl:860000000000001两条命令不在同一个slot上,所以需要单独执行下面这条命令 setex mall:total:freq:ctrl:860000000000001 3127 3经过第3次的优化后,这些命令还是需要2次网络交互。较劲的我还是不甘心,想要将其优化到只需要一次网络交互即可,亿华云计算有没有办法?当然有!
第4次优化这次优化利用了一个高级特性:hashtag。是啥子意思呢?我们知道,RedisCluster总计有16*1024=16384个slot。那么执行一条Redis命令时,其key对应的是哪个slot呢?是利用这样一个计算公式得到的:slot = CRC16(key)%16384,示意图如下:
也就是说,默认情况下,key在哪个slot上,与key有关。那么,我们能否只让key在哪个slot上与部分key有关呢?当然可以,这就是hashtag特性。用法非常简单,假设一个key是mall:sale:freq:ctrl:860000000000001,我们只需要用{ }将key中我们需要的那部分包括起来即可。例如,我们只想让其根据用户IMEI计算即可,那么key是这样的:mall:sale:freq:ctrl:{ 860000000000001}。只要key中有{ 860000000000001}这一部分,就一定落在同一个slot上。
所以,企商汇第四次优化以后的命令执行如下所示:
pipeline( hmset mall:sale:freq:ctrl:${ 860000000000001} 599055114591 1 599055114592 2 expire mall:sale:freq:ctrl:${ 860000000000001} 3127 setex mall:total:freq:ctrl:${ 860000000000001} 3127 3 )优化后,5条Redis命令压缩到3条Redis命令,并且3条Redis命令只需要发送一次,并且结果也一次就能全部返回。简直完美!!
注意事项我们在使用hashtag特性时,一定要注意,不能把key的离散性变得非常差。以本文为例,没有利用hashtag特性之前,key是这样的:mall:sale:freq:ctrl:860000000000001,很明显这种key由于与用户相关,所以离散性非常好。而使用hashtag以后,key是这样的:mall:sale:freq:ctrl:{ 860000000000001},这种key还是与用户相关,所以离散性依然非常好。我们千万不要这样来使用hashtag特性,例如将key设置为:mall:{ sale:freq:ctrl}:860000000000001。这样的话,无论有多少个用户多少个key,其{ }中的内容完全一样都是sale:freq:ctrl,也就是说,所有的key都会落在同一个slot上,导致整个Redis集群出现严重的倾斜问题。
很赞哦!(8)
上一篇: 4、参加域名拍卖会
相关文章
- 3、不明先知,根据相关征兆预测可能发生的事件,以便提前做好准备,赶紧注册相关域名。;不差钱域名;buchaqian抢先注册,就是这种敏感类型。预言是最敏感的状态。其次,你应该有眼力。所谓眼力,就是善于从社会上时不时出现的各种热点事件中获取与事件相关的域名资源。眼力的前提是对域名领域的熟悉和丰富的知识。
- 什么样的邮箱才是安全的电子邮件地址?
- 域后缀首选.com,.net,然后是.cn。后缀选择不当,导致流量损失。域名是企业与互联网网址之间的链接,关键是企业在网络上存在的标志。因此,选择好域名是开展网上工作的首要重要条件。
- 4、注册门槛低
- 域名不仅仅是一个简单的网站。对于有长远眼光的公司来说,在运营网站之前确定一个优秀的域名对有长远眼光的公司来说是非常重要的。这对今后的市场营销、产品营销和企业品牌建设都具有十分重要的意义。优秀的域名是企业在市场竞争中获得持久优势的利器。
- 比较短的域名方便用户记忆和传播,它带来的好处往往会超过其他类型的域名,如果你非要域名短而且还要包含关键词,那么往往会事与愿违,现在这种域名基本上是可遇而不可求的。
- 个人域名转为公司需要什么条件?个人域名转为公司该怎么做?
- .net 适用于从事Internet相关的网络服务的机构或公司
- 在更换域名后,并不是就万事大吉了,我们需要将旧域名做301重定向到新域名上,转移旧域名的权重到新域名上。
- 为啥修改dns服务器?dns服务器与域名有何联系?
热门文章
站长推荐
前面这两个步骤都是在本机完成的。到这里还没有涉及真正的域名解析服务器,如果在本机中仍然无法完成域名的解析,就会真正请求域名服务器来解析这个域名了。
比较短的域名方便用户记忆和传播,它带来的好处往往会超过其他类型的域名,如果你非要域名短而且还要包含关键词,那么往往会事与愿违,现在这种域名基本上是可遇而不可求的。
(4) 使用何种形式的域名后缀对网页搜索影响不大,但域名后缀也需要考虑方便用户记忆
四、一定要仔细阅读细节
以上的就是为大家介绍的关于域名的详解
新手可以注册cc域名吗?cc域名有什么特点?
4、参加域名拍卖会
3、不明先知,根据相关征兆预测可能发生的事件,以便提前做好准备,赶紧注册相关域名。;不差钱域名;buchaqian抢先注册,就是这种敏感类型。预言是最敏感的状态。其次,你应该有眼力。所谓眼力,就是善于从社会上时不时出现的各种热点事件中获取与事件相关的域名资源。眼力的前提是对域名领域的熟悉和丰富的知识。