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

2018-09-25 09:39:42 +08:00
 mengdodo
如果在 redis 中设置了某个账号最多使用 100 次,现在前台发出的一个请求,那我给他一个位置,但是他 15 分钟内未使用,我要收回计数,还原之前的 100 次,怎么恢复啊?
4445 次点击
所在节点    Redis
10 条回复
az422
2018-09-25 09:46:03 +08:00
每次自增后设置该 key 十五分钟后过期,直到 100
Immortal
2018-09-25 09:51:21 +08:00
想了下 这个需求其实用关系型数据库会简单一些 弄一个表来记录申请和实际使用 大概字段:账号 id 申请时间 是否使用 使用时间。
Mohanson
2018-09-25 09:58:58 +08:00
描述一大堆,不就是限流吗,搜令牌桶算法
rbe
2018-09-25 10:36:10 +08:00
简单说就是,15 分钟最多请求 100 次接口是吧。那就是一个接口限流问题,同楼上说的,令牌桶算法,可以搜一下各个语言的 RateLimiter 实现
takeoffyoung
2018-09-25 10:43:59 +08:00
既然你能拿到他“未使用过”这个信息,相信同理可以拿到他“使用过”,那就仅在“使用过”事件的回调中给响应的 key incr。“那我给他一个位置” 记一条日志就好
momocraft
2018-09-25 11:17:38 +08:00
为什么你们都看得懂这个中文 :scream:
honeycomb
2018-09-25 11:48:02 +08:00
令牌筒算法?
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
2018-09-25 12:32:43 +08:00
https://redis.io/commands/incr
看官方文档的 Rate limiter
mmdsun
2018-09-25 19:06:50 +08:00
一句话:Key 设过期时间。没有 key 重新创。自增 key。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/492240

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX