【地铁上的Redis与C#】数据类型(十三)--综合案例

到这我们的Redis的数据类型就全部讲完了,那么我们这篇文章就来看两个综合案例吧。

案例一

我们互联网上会遇到很多只提供API接口不提供界面的网站,我们需要自己编写界面并调用API接口。那么这些网站对于免费用户都会限制每分钟的调用次数,我们该如何使用Redis来实现呢?我们有两种解决方案,我们来看一下吧。

解决方案

1. 解决方案一

  • 设计计数器:记录调用次数,用于控制业务执行次数,用户Id作为key,使用次数作为value;
  • 在调用前获取次数,判断是否超过限定次数。如果不超过次数的情况下,每次调用计数器加1,如果业务调用失败则计数器减1;
  • 将计数器的生命周期设置为指定周期,比如每分钟10次,当到一分钟value设置为0。

上述方案转化为Redis命令如下:

  • 使用 setex 指令,这时因为它可以指定key的生命周期,例如在第一次调用时,我们将生命周期时间设置为60秒setex uid123 60 1
  • 后续调用的时先获取uid123的值,get uid123;
  • 如果不超过10次,那么就使用incr命令将value加1,incr uid123
  • 如果超过10次,那么我们的程序代码就向调用方返回相应的提示;
  • 当时间已经超过60秒后,再次调用时我们重新从第一步开始执行。以此类推,循环往复。

2. 解决方案二 上面的解决方案存在一个缺陷,每次请求都需要判断一下是否超过10次,那么我们来优化一下。

  • 不进行最大值判断,而是利用incr命令操作超过最大值就会抛出异常的形式来替代每次判断是否超过最大值;
  • 判断是否时nil,如果是nil则将value值设置为最大值-10,如果不是nil则将value加1,当业务调用失败时就将value减1;
  • 当加操作后的值超过最大值时Redis就会报错,这时我们就告知调用方超过调用次数。

上述方案转化为Redis命令如下:

  • 使用 setex 指令将生命周期时间设置为60秒,值为可存储的最大值减10setex uid123 60 9223372036854775797
  • 每次调用就是使用incr命令将value加1,incr uid123
  • 当超过最大值时Redis就会抛出异常;
  • 当时间已经超过60秒后,再次调用时我们重新从第一步开始执行。以此类推,循环往复。

Tip:Redis可应用于限时按次结算的服务控制。

案例二

待续。。。。

解决方案

待续。。。。

总结

本篇文章举例了Redis两个常见的使用场景。