实例一:
业务场景
人工智能领域的语义识别与自动对话将是未来服务业机器人应答呼叫体系中的重要技术,百度自研用户评价语义识别服务,免费开放给企业试用,同时训练百度自己的模型。现对试用用户的使用行为进行限速,限制每个用户每分钟最多发起10次调用
解决方案
设计计数器,记录调用次数,用于控制业务执行次数。以用户id作为key,使用次数作为value
在调用前获取次数,判断是否超过限定次数
不超过次数的情况下,每次调用计数+1
业务调用失败,计数-1
为计数器设置生命周期为指定周期,例如1秒/分钟,自动清空周期内使用次数
//查看用户id为415的是否存在
127.0.0.1:6379> get 415
(nil)
//设定生命周期和计数
127.0.0.1:6379> setex 415 60 1
OK
//查看是否存在
127.0.0.1:6379> get 415
"1"
127.0.0.1:6379> incr 415
(integer) 2
127.0.0.1:6379> incr 415
(integer) 3
127.0.0.1:6379> incr 415
(integer) 4
127.0.0.1:6379> incr 415
(integer) 5
127.0.0.1:6379> incr 415
(integer) 6
127.0.0.1:6379> incr 415
(integer) 7
127.0.0.1:6379> incr 415
(integer) 8
127.0.0.1:6379> incr 415
(integer) 9
127.0.0.1:6379> incr 415
(integer) 10
//第十次就在业务层处理拒绝
127.0.0.1:6379> get 415
"10"
//生命周期结束
127.0.0.1:6379> get 415
(nil)
解决方案改良
取消最大值的判定,利用incr操作超过最大值抛出异常的形式替代每次判断是否大于最大值
判断是否为nil,
如果是,设置为Max-次数
如果不是,计数+1
业务调用失败,计数-1
遇到异常即+操作超过上限,视为使用达到上限
设置为最大值减去操作次数 自增加超过最大值即报错
实例二
redis 应用于基于时间顺序的数据操作,而不关注具体时间
最新的消息应该在最上
127.0.0.1:6379> lrem 100 1 200
(integer) 0
127.0.0.1:6379> lpush 100 200
(integer) 1
127.0.0.1:6379> lrem 100 1 300
(integer) 0
127.0.0.1:6379> lpush 100 300
(integer) 2
127.0.0.1:6379> lrem 100 1 400
(integer) 0
127.0.0.1:6379> lpush 100 400
(integer) 3
127.0.0.1:6379> lrem 100 1 200
(integer) 1
127.0.0.1:6379> lpush 100 200
(integer) 3
127.0.0.1:6379> lrem 100 1 300
(integer) 1
127.0.0.1:6379> lpush 100 300
(integer) 3
127.0.0.1:6379> lrange 100 0 -1
1) "300"
2) "200"
3) "400"
使用list:
依赖list的数据具有顺序的特征对消息进行管理,将list结构作为栈使用
对置顶与普通会话分别创建独立的list分别管理
当某个list中接收到用户消息后,将消息发送方的id从list的一侧加入list(此处设定左侧)
多个相同id发出的消息反复入栈会出现问题,在入栈之前无论是否具有当前id对应的消息,先删除对应id
推送消息时先推送置顶会话list,再推送普通会话list,推送完成的list清除所有数据
消息的数量,也就是微信用户对话数量采用计数器的思想另行记录,伴随list操作同步更新