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

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

  •  
  •   mengdodo · 2018-09-25 09:39:42 +08:00 · 4641 次点击
    这是一个创建于 2256 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果在 redis 中设置了某个账号最多使用 100 次,现在前台发出的一个请求,那我给他一个位置,但是他 15 分钟内未使用,我要收回计数,还原之前的 100 次,怎么恢复啊?
    10 条回复    2018-09-25 19:06:50 +08:00
    az422
        1
    az422  
       2018-09-25 09:46:03 +08:00 via Android
    每次自增后设置该 key 十五分钟后过期,直到 100
    Immortal
        2
    Immortal  
       2018-09-25 09:51:21 +08:00 via Android
    想了下 这个需求其实用关系型数据库会简单一些 弄一个表来记录申请和实际使用 大概字段:账号 id 申请时间 是否使用 使用时间。
    Mohanson
        3
    Mohanson  
       2018-09-25 09:58:58 +08:00 via Android
    描述一大堆,不就是限流吗,搜令牌桶算法
    rbe
        4
    rbe  
       2018-09-25 10:36:10 +08:00
    简单说就是,15 分钟最多请求 100 次接口是吧。那就是一个接口限流问题,同楼上说的,令牌桶算法,可以搜一下各个语言的 RateLimiter 实现
    takeoffyoung
        5
    takeoffyoung  
       2018-09-25 10:43:59 +08:00
    既然你能拿到他“未使用过”这个信息,相信同理可以拿到他“使用过”,那就仅在“使用过”事件的回调中给响应的 key incr。“那我给他一个位置” 记一条日志就好
    momocraft
        6
    momocraft  
       2018-09-25 11:17:38 +08:00
    为什么你们都看得懂这个中文 :scream:
    honeycomb
        7
    honeycomb  
       2018-09-25 11:48:02 +08:00 via Android
    令牌筒算法?
    joyme
        8
    joyme  
       2018-09-25 12:04:20 +08:00
    限流的方案令牌桶算法确实是一个好的选择。但是你这个问题明显更简单一些,其实没有必要 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/
    keakon
        9
    keakon  
       2018-09-25 12:32:43 +08:00
    https://redis.io/commands/incr
    看官方文档的 Rate limiter
    mmdsun
        10
    mmdsun  
       2018-09-25 19:06:50 +08:00 via Android
    一句话:Key 设过期时间。没有 key 重新创。自增 key。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5050 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 09:46 · PVG 17:46 · LAX 01:46 · JFK 04:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.