开发者学堂课程【Redis 入门到精通(基础篇):数据类型-案例:按次结算的服务控制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/764/detail/13395
数据类型-案例:按次结算的服务控制
内容介绍
一、数据类型实践案例
二、Tips16
一、数据类型实践案例
业务场景
人工智能领域的语义识别与自动对话将是未来服务业机器人应答呼叫体系中的重要技术,百度自研用户评价语义识别服务,免费开放给企业试用,同时训练百度自己的模型。
现对试用用户的使用行为进行限速,限制每个用户每分钟最多发起10次调用五个类型都学习完了,做一个综合的分析,对于现在这个社会来说,人工智能发展较快,自然是别语言未来空间比较大,像现在的拟合机器人特别人性化,让机器人用自然语言处理数据,帮我们快速完成繁重的工作,现在很多公司都有这一类型的自然语言,我们可以去申请使用,然后有次数限制,做这样一个限制的管理服务控制。
这个控制服务就是我们向服务器发起调用,在规定次数是可以实现的,但是到达了指定次数就不会放行了,要做一个次数控制,很容易想到的就是计数器,可以实现,在加之前进行一个判断,判断是否超次数,从而决定是否放行。
解决方案
●设计计数器,记录调用次数,用于控制业务执行次数。以用户id作为 key,使用次数作为 value
●在调用前获取次数,判断是否超过限定次数
不超过次数的情况下,每次调用计数+1
业务调用失败,计数-1
●为计数器设置生命周期为指定周期,例如1秒/分钟,自动清空周期内使用次数
然后记录一个值,不停的加,不超过次数的情况下,每次调用计数+1,业务调用失败,计数-1,然后我们就需要设置一个生命周期,到达了一定次数就进行清空,这样就OK了,用这个方案就可以达到效果,我们就需要用这个id创建一个key,然后判断key不存在,进行一个加一操作,同时设定生命周期为60秒,如果下一次过来进行判断发现非空,那么就加一,反复操作后会变成10,这个时候再去调用,判断发现已经到达了10,那么就拒绝调用,终止掉,回答一个信息表明情况。
接下来进行操作,获取get 415,setex 415 60 1,第二次过来get 415,increase 415,然后一直获取重复,到达10之后,get 415,超过了使用次数,然后在到达了时间后,就会发现变成了nil,就可以反复走这个过程,这样就可以做这个通知了,这样方案就解决了。
解决方案改良
●取消最大值的判定,利用 incr 操作超过最大值抛出异常的形式替代每次判断是否大于最大值
●判断是否为 nil,
如果是,设置为 Max 次数
如果不是,计数+1
业务调用失败,计数-1
●遇到异常即+操作超过上限,视为使用达到上限
这里有一个问题,对于判断这个地方,每次判断,耗费了资源跟时间,我们在到达限制时再去取消,利用incr操作超过最大值抛出异常的形式替代每次判断是否大于最大值,然后到达了最大值会报错。
接下来,我们就使用最大值减去执行次数,生命周期不变,还是继续增加,到达了我们设定的最大值,就报错,然后这个时候,再进行判断是否ok。
然后get 415,setex 415 60 9223372036854775797,设定最大值,get 415,然后 incr,重复,到达十次,超范围,就会溢出,报错,然后此时判断,影响客户体验,免去了每次做判断的情况。
二、Tips16
Redis 应用于限时按次结算的服务控制。