简单限流策略的意义在于,系统要限定用户的某个行为在指定的时间里只能发生 N 次。
这里使用的是一个 zset + 滑动窗口
核心思想是,zset包含一个 key、一个value、一个score
key = 用户名 + 动作
value = uuid 因为是不能重复的,也可以是时间戳
score = 时间戳
假设现在的需求是,一个用户,在一天之内,只能提交2次 评论,那么每次用户提交comment之后
用户提交2次评论,就会添加2条记录
127.0.0.1:6379> zadd lizhe_post_comment 202105211043 uuid_one
(integer) 1
127.0.0.1:6379> zadd lizhe_post_comment 202105211044 uuid_two
(integer) 1
127.0.0.1:6379>
下面开始一个标准添加流程
- 第一步,删除1天之前的旧数据
每次添加记录时,要先进行 数据清洗 + 数据统计
数据清洗 需要 zremrangebyscore , 它会删除分数区间段内的元素,参数时 起始 score 和 终止 score
这里再每次存储之前,因为需求是 1天之内,那么应该删除24小时之前的数据
zremrangebyscore lizhe_post_comment 0 202105201043
2. 第二步
然后进行统计
zcount lizhe_post_comment 0 202105211117
此时可以得到 没有过期的 操作记录数,这里是 2
然后判断是否符合 1天之内,提交2次的限制,决定是否继续