再次求救 redis 用户限制频次问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
chenfang
V2EX    程序员

再次求救 redis 用户限制频次问题

  • /li>  
  •   chenfang 326 天前 2022 次点击
    这是一个创建于 326 天前的主题,其中的信息可能已经有所发展或是发生改变。

    虽然是限制频次,更多的是和业务代码结合的问题

    现在的需求是一次请求进入之后,只读取一次(或者是一个常量不会根据下游服务的增多而增多)redis 数据,来论坛寻求帮助,看有没有好的解决方案

    现在的服务情况是: 一个 tomcat 集群中,控制频次按用户 id 去限制,一次请求就是一个用户,可以有多个限制频次的任务

    一个请求进入 tomcat 后,之后会同时发送比如三次请求(三个线程)给不同的下游服务,限制频次是针对不同的下游服务,可能有两个个下游限制了频次,也可能是一个

    之前的条件比如会有 qps 限制,需要等到过滤条件走到限制频次的代码才知道需不需要限制频次,把读取 redis 尽可能往后放,减少读取 redis 的次数

    还有一个问题是 redis 里边不光只有频次限制,还有一些别的数据,可能在频次限制之前或者之后使用

    我目前想到的解决方案是:

    1. 那些不是限制频次的 key,在遇到需要读取 redis 的时候,使用 pipeline 统一读取
    2. 在循环过滤条件的时候,把请求 redis 的 key 存在一起,然后使用 CyclicBarrier+lua 脚本读取和写入限制频次 keys
    第 1 条附言    326 天前

    这里的用户频次限制是针对用户id+任务id

    然后就是我们只有tomcat,不是微服务..

    第 2 条附言    325 天前

    这是图片

    infoscope
        1
    infoscope  
       326 天前 via iPhone
    这样坐为了解决什么问题
    memorycancel
        2
    memorycancel  
       326 天前
    我理解 tomcat 应该是总入口,如果是为了限制业务,那么应该把 redis 读取模块放到应用层 application ,在应用层写一个模块,而不是 tomcat 。
    magicZ
        3
    magicZ  
       326 天前
    看半天没看懂需求 ,要不还是画个图吧
    cJ8SxGOWRH0LSelC
        4
    cJ8SxGOWRH0LSelC  
       326 天前
    你这个需求和方案就相当于实现一个中间件把 redis 封装了一层, 对 redis 的请求进行过滤和拦截。 但是这个专门读取 redis 的服务不就成了一个新的“Redis”了吗? 依然存在资源访问瓶颈, 那还不如直接去读 Redis 。
    itechify
        5
    itechify  
    PRO
       326 天前
    友情提示,剧情回顾:
    集群如何控制 QPS? t/1087045
    redis 控制用户频次问题 t/1088766
    redis 逆天问题 每多少分钟限制多少次 t/1089526
    xuanbg
        6
    xuanbg  
       326 天前
    直接网关限流不行吗?限流策略有:
    1 、限制访问间隔时间,譬如每次访问必须间隔 3 秒。这个可以有效防刷。
    2 、设定时间窗口内限制访问次数,如每小时 300 次,从第一次访问开始计时,300 次满就必须要等计时满 1 小时后次数清零。
    3 、以上两个结合,这样虽然是每 3 秒可以访问一次,但每小时上限只有 300 次而非 1200 次。
    chenfang
        7
    chenfang  
    OP
       326 天前
    @infoscope 解决请求 redis 次数过多的
    chenfang
        8
    chenfang  
    OP
       326 天前
    @oneisall8955
    集群控制 QPS 那个跟现在 redis 控制用户频次不是一个问题

    集群控制 QPS 的解决方案基于请求量大概率是比较平稳的所以只用了一个百分比来过滤请求,动态调整百分比大小基本就可以实现,这种性能影响最小,结论就是能用
    realpg
        9
    realpg  
    PRO
       325 天前
    你需要做的是把你的需求说明白 而不是把你最开始帖子的内容隔一阵子就重新发一遍

    你的四个帖子我都看过 表达能力堪忧
    chenfang
        10
    chenfang  
    OP
       325 天前
    @realpg 好吧 我再整理一下
    caryqy
        11
    caryqy  
       325 天前
    @chenfang 理论上单节点 10w+, 可能有点多想了,直接用别怕,请求量对于 redis 可能还没开始发力
    codespots
        12
    codespots  
       325 天前
    我觉得你遇到了 X-Y 问题,而不是具体的方案设计问题
    chenfang
        13
    chenfang  
    OP
       325 天前
    @caryqy 我们一天的请求是 250 亿左右,换算 qps 为:31 万,不是所有都会请求 redis,按一半的话 15W*(3 或者 4)=45W,虽然现在是集群,但是这个数量也不少了
    caryqy
        14
    caryqy  
       325 天前
    @chenfang 250 亿, 牛逼, 撤回我说的
    monmon
        15
    monmon  
       325 天前
    我猜你在找的是 Redisson RRateLimiter
    这里有个封装好的,稍微改造一下应该就可以满足你的需求
    https://github.com/dromara/RuoYi-Vue-Plus/tree/5.X/ruoyi-common/ruoyi-common-ratelimiter
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2731 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 08:46 PVG 16:46 LAX 01:46 JFK 04:46
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86