利用Redis对含有分页参数的API接口做调用次数限制

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 利用Redis对含有分页参数的API接口做调用次数限制

 背景 - 限制接口调用次数:

       提供内部调用的全量拉取数据接口,以用户appid作为维度区分,一定时间段内(比如1小时),查询某一接口的appid和limit、offset等组合参数只能查询一次,多次查询相同组合参数则返回错误值。

思路:

       采用string类型,key就是模块名:api_limiter_xxx(根据需要自定义key名称),value就是当前可以访问的页数(每次访问成功都自增1)。第一次访问某接口时,若key不存在,那么就添加;若存在,则获取当前redis中对应key的"页数值",并与入参Limit和Offset计算后的页数结果进行比较,若相等则调用成功,反之调用失败。

其中,在设置key和value的时候也要设置"过期时间"。所以关键在于 SETNX 的使用,若存在,则匹配计算的页数与redis中的计数器页数是否相等,若不存在,则设置kv。

注意:其中每次set key的值的时候,过期时间的处理。这里在set之前先通过TTL获取key剩余的过期时间,然后set时再带入接下来剩余的时间即可,避免每次都重新设置固定的过期时间。

    1. 初始时,redisPageCnt = 1
    2. 首次调用接口时,Limit=10,Offset=0,calculateCnt = (Limit + Offset) / Limit = 1;redisPageCnt=1
    3. 此时 calculateCnt = redisPageCnt 相等,redisPageCnt++,redisPageCnt = 2
    4. 再次调用接口时,Limit=10,Offset=10,calculateCnt = (Limit + Offset) / Limit = 2;redisPageCnt=2
    5. 此时 calculateCnt = redisPageCnt 相等,redisPageCnt++,redisPageCnt = 3
    6. ...

           这样的话就可以按页数从前往后递增,每页在限制的超时时间内(1小时)访问一次。在key的超时时间内,访问过的页数也不能再次访问,除非redis中的key超时时间失效。

    请求示例:

    var req = TestReq{ Appid: 1256299843, Limit: 10, Offset: 20, }

    packagemainimport (
    "fmt""strconv""time""github.com/go-redis/redis")
    // 限流:针对含有分页参数的接口,对于不同"Limit和Offset"组合做限制,避免某个用户大量请求影响后台服务处理其他正常请求// 示例://  var req = TestReq{//      Appid:  1256299843,//      Limit:  10,//      Offset: 20,//  }typeTestReqstruct {
    Appiduint64LimitintOffsetint}
    funcAPILimiter(reqTestReq) (errerror) {
    ifreq.Limit!=10 { // 校验入参,暂时写死,根据情况修改fmt.Println("req.Limit format err: ")
    // return response ...return    }
    redisCli :=redis.NewClient(&redis.Options{
    Addr:     "xxx.xxx.xxx.xxx:3306", // ip:portPassword: "yundingyd",
    PoolSize: 10,
        })
    // pong, err := redisCli.Ping().Result()// 不存在 -> 初始化;存在 -> 不处理redisKey :="api_limiter_"+strconv.FormatUint(req.Appid, 10)
    isOk, err :=redisCli.SetNX(redisKey, 1, time.Hour).Result() // 限制超时1小时,Result()针对不同命令自动转换对应结果iferr!=nil&&err!=redis.Nil&&isOk==false {
    fmt.Println("APILimiter SetNX err: ", err)
    // return response ...return    }
    calculatePageCnt := (req.Limit+req.Offset) /req.LimitredisPageCnt, err :=redisCli.Get(redisKey).Int()
    iferr!=nil&&err!=redis.Nil&&isOk==false {
    fmt.Println("APILimiter redisCli.Get err: ", err)
    // return response ...return    }
    ifcalculatePageCnt!=redisPageCnt {
    fmt.Printf("接口调用失败:当前Limit和Offset对应的页数无效: limit=%d, offset=%d, calculateCnt=%d, redisPageCnt=%d\n", req.Limit, req.Offset, calculatePageCnt, redisPageCnt)
    // return response ...return    }
    deferfunc() {
    iferr==nil { // 具体的业务逻辑,期间可能会产生err,只有err为空时才执行以下逻辑~// 先查询当前key的剩余过期时间timeDuration, err :=redisCli.TTL(redisKey).Result()
    iferr!=nil&&err!=redis.Nil {
    fmt.Println("redisCli.TTL err: ", err)
    // return response ...return            }
    // 再设置当前key的剩余过期时间isOk, err :=redisCli.Set(redisKey, redisPageCnt+1, timeDuration).Result() // page + 1iferr!=nil&&err!=redis.Nil&&isOk!="OK" {
    fmt.Println("redisCli.Set err: ", err)
    // return response ...return            }
    fmt.Println("接口调用成功!!!")
            }
        }()
    // 具体的业务逻辑(期间可能会产生err,除非期间err为nil,否则defer函数不执行 page+1 等操作):// ...return}
    funcmain() {
    varreq=TestReq{
    Appid:  1256299843,
    Limit:  10,
    Offset: 20,
        }
    err :=APILimiter(req)
    iferr!=nil {
    fmt.Println("APILimiter err: ", err)
    return    }
    }

    image.gif


    相关实践学习
    基于Redis实现在线游戏积分排行榜
    本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
    目录
    相关文章
    |
    20天前
    |
    监控 算法 API
    电商API接口对接实录:淘宝优惠券接口对接处理促销监控系统
    在电商开发中,淘宝详情页的“券后价计算”是极易出错的环节。本文作者结合实战经验,分享了因忽略满减券门槛、有效期、适用范围等导致的踩坑经历,并提供了完整的解决方案,包括淘宝API签名生成、券后价计算逻辑、常见坑点及优化建议,助力开发者精准实现券后价功能,避免业务损失。
    |
    15天前
    |
    JSON API 数据安全/隐私保护
    深度分析淘宝卖家订单详情API接口,用json返回数据
    淘宝卖家订单详情API(taobao.trade.fullinfo.get)是淘宝开放平台提供的重要接口,用于获取单个订单的完整信息,包括订单状态、买家信息、商品明细、支付与物流信息等,支撑订单管理、ERP对接及售后处理。需通过appkey、appsecret和session认证,并遵守调用频率与数据权限限制。本文详解其使用方法并附Python调用示例。
    |
    17天前
    |
    JSON API 数据格式
    淘宝/天猫图片搜索API接口,json返回数据。
    淘宝/天猫平台虽未开放直接的图片搜索API,但可通过阿里妈妈淘宝联盟或天猫开放平台接口实现类似功能。本文提供基于淘宝联盟的图片关联商品搜索Curl示例及JSON响应说明,适用于已获权限的开发者。如需更高精度搜索,可选用阿里云视觉智能API。
    |
    2月前
    |
    人工智能 监控 API
    API即生产力:电商行业如何用“数字接口”重构竞争壁垒?
    电商API作为连接平台、商家、物流与支付的“数字钥匙”,正系统性破解数据孤岛、运营低效、决策滞后与体验断层等传统电商痛点。通过数据实时同步、流程自动化、智能分析与服务闭环,API助力企业提升效率、优化决策、增强用户体验,并推动全行业向智能化、数字化跃迁。
    |
    2月前
    |
    存储 监控 API
    零基础 3 天搞定京东 / 淘宝 API 开发,从注册到调通接口全流程拆解
    本文详解京东/淘宝API开发入门,涵盖账号注册、应用创建、签名生成及实战项目,助零基础开发者3天掌握电商API调用,实现商品数据获取与价格监控。
    |
    28天前
    |
    JSON 算法 API
    淘宝商品评论API接口核心解析,json数据返回
    淘宝商品评论API是淘宝开放平台提供的数据服务接口,允许开发者通过编程方式获取指定商品的用户评价数据,包括文字、图片、视频评论及评分等。其核心价值在于:
    |
    1月前
    |
    域名解析 JSON API
    【干货满满】如何处理requests库调用API接口时的异常情况
    在调用 API 时,网络波动、服务器错误、参数异常等情况难以避免。本文提供一套系统化的异常处理方案,涵盖 requests 库常见异常类型、处理策略、实战代码与最佳实践,通过分类处理、重试机制与兜底策略,提升接口调用的稳定性与可靠性。
    |
    2月前
    |
    人工智能 安全 API
    2025电商API新特性:实时数据流、GraphQL接口与隐私合规
    2025年电商API迎来技术与合规双重革新,实时数据流、GraphQL接口、隐私合规成为核心突破方向,推动全息电商、动态定价、供应链协同等场景升级,实现性能优化与用户隐私保护的协同发展。
    |
    2月前
    |
    JSON API 数据格式
    Python采集京东商品评论API接口示例,json数据返回
    下面是一个使用Python采集京东商品评论的完整示例,包括API请求、JSON数据解析