Redis综合实践
卑微小吴励志写博客第23天。
前面学习了redis的五种数据类型,也给出了很多案例,但是都是单一的针对一种数据类型的案例。
业务场景一:
人工智能领域的语义识别和自动对话将是未来服务业机器人应答呼叫体系中的重要技术,百度自研的用户语义评价服务,免费给企业试用,同时训练百度自己的模型。现对试用用户的使用行为进行限速,限制每个用户每分钟最多发起十次调用。
解决方案
- 设计一个计数器,用于控制调用次数,就是统计客户调用过的次数。用户id作为key,调用次数作为value。
- 在调用前获取次数,用于判断是否超过限定次数。
不超过次数,调用次数+1。
业务调用失败,计数-1. - 为计数器设置生命周期,例如1分钟,自动清空周期内使用次数。
setex key timeout value 命令就可以完成上面的设置。
例如: setex user:001 60 1
每次调用 incr user:001
解决方案改良
这样做,每次都要判断用户的次数是不是大于10。怎样可以让用户不用每次都判断?
- 取消最大值的判定,利用incr操作超过最大值抛出异常的形式,来取消每次都判定最大值。
- 判断是否为nil,如果是,value设置为MAX-次数,如果不是,计数+1,业务调用失败,计数-1。
- 遇到异常则达到次数上限。
因为value的值设置时是有大小限制的,我们去最大值作为判断的依据,这样就可以不用每次都去判断次数是否达到。
业务场景二:
使用微信的时候,接受到的消息一般都是时间最近的放在前面,当多个好友或者订阅号同时发消息,排名会不断更换。同时还有置顶功能。一旦用户离线后,再次上线的时候消息应该按照怎样的顺序展示?
解决方案:
- 利用list的数据具有顺序的特征对消息进行管理,将list结构作为栈使用。
- 对置顶与普通会话分别创建独立的list分别管理。
- 当某个list中接收到用户消息后,将消息发送方的id从list的一侧加入list(此处设定为左侧)
- 多个相同id发出的消息,先在栈中删除,然后再入栈。
- 推送消息时先推送置顶list,再推送普通会话list。
- 这里面还可以做计数功能,也就是微信用户对话数量,采用计数器的思想另行记录,伴随list操作同步更新。
tips:
redis可以应用于基于时间顺序的数据操作,而不关注具体时间。