首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
华为云
V2EX  ›  Redis

求大神解答 redis 还原计数的方式

  •  
  •   mengdodo · 51 天前 · 1029 次点击
    这是一个创建于 51 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果在 redis 中设置了某个账号最多使用 100 次,现在前台发出的一个请求,那我给他一个位置,但是他 15 分钟内未使用,我要收回计数,还原之前的 100 次,怎么恢复啊?
    10 回复  |  直到 2018-09-25 19:06:50 +08:00
        1
    az422   51 天前 via Android
    每次自增后设置该 key 十五分钟后过期,直到 100
        2
    Immortal   51 天前 via Android
    想了下 这个需求其实用关系型数据库会简单一些 弄一个表来记录申请和实际使用 大概字段:账号 id 申请时间 是否使用 使用时间。
        3
    Mohanson   51 天前 via Android
    描述一大堆,不就是限流吗,搜令牌桶算法
        4
    rbe   51 天前
    简单说就是,15 分钟最多请求 100 次接口是吧。那就是一个接口限流问题,同楼上说的,令牌桶算法,可以搜一下各个语言的 RateLimiter 实现
        5
    takeoffyoung   51 天前
    既然你能拿到他“未使用过”这个信息,相信同理可以拿到他“使用过”,那就仅在“使用过”事件的回调中给响应的 key incr。“那我给他一个位置” 记一条日志就好
        6
    momocraft   51 天前
    为什么你们都看得懂这个中文 :scream:
        7
    honeycomb   51 天前 via Android
    令牌筒算法?
        8
    joyme   51 天前
    限流的方案令牌桶算法确实是一个好的选择。但是你这个问题明显更简单一些,其实没有必要 15 分钟后实时的自动还原。换一种思路:

    1. 每次使用时记录当前剩余的次数和使用的时间
    2.每次查询时判断上次的使用时间,如果时间差超过 15 分钟,就当成 100 次去计算,否则使用计数器。这样就免去了实时更新使用次数的问题。
    3.redis 这样使用会有一个 check and set 的问题,必须保证原子性操作,可以使用 lua 脚本去解决。

    这里是一个令牌桶的实现,基本思路都是一样的。

    https://www.myway5.com/index.php/2018/04/16/%E6%8E%A5%E5%8F%A3%E8%AF%B7%E6%B1%82%E9%80%9F%E7%8E%87%EF%BC%88%E6%8E%A5%E5%8F%A3%E9%98%B2%E5%88%B7%EF%BC%89%E9%99%90%E5%88%B6%E6%96%B9%E6%A1%88/
        9
    keakon   50 天前
    https://redis.io/commands/incr
    看官方文档的 Rate limiter
        10
    mmdsun   50 天前 via Android
    一句话:Key 设过期时间。没有 key 重新创。自增 key。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3117 人在线   最高记录 3821   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 20ms · UTC 04:08 · PVG 12:08 · LAX 20:08 · JFK 23:08
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1