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

如何解决空数想据的缓存穿透?

  •  
  •   yuanyao · 2024-11-11 16:16:52 +08:00 · 2285 次点击
    这是一个创建于 370 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上周服务流量出现了一波高峰,db 查询流量从平时的 2k 左右增加到 1w 左右,看监控其中 4k 的查询结果都是 record not found ,我们服务使用了 local cache ,只缓存了能查询到的数据,目前自己能想到的优化方案有

    1. localcache 改造下,空数据也存起来
    2. 使用面试宝典解决这种问题的标准答案-布隆过滤器,使用 redis 自带的 redisbloom,将线上数据刷一遍进去,localcache 没命中的话,先查询下 redisbloom ,命中在查 db 。不过布隆过滤器我基本没在真实项目中见到过。

    大家有什么方案推荐吗

    21 条回复    2024-11-13 14:59:08 +08:00
    ccw4wcc
        1
    ccw4wcc  
       2024-11-11 16:23:59 +08:00
    蹲一个答案,第一时间也是想到布隆过滤器,不过没有实战过
    Edward4074
        2
    Edward4074  
       2024-11-11 16:37:35 +08:00
    redis 缓存,空数据也存个特殊标识,找个合适的地方统一判断这个特殊字符,返回空对象
    coderxy
        3
    coderxy  
       2024-11-11 16:42:58 +08:00
    实际业务中很简单就是把空数据也缓存起来就完事了。
    luckyrayyy
        4
    luckyrayyy  
       2024-11-11 16:43:46 +08:00
    实际业务一般就是缓存空数据吧
    coderzhangsan
        5
    coderzhangsan  
       2024-11-11 16:46:39 +08:00
    简单的办法,就是缓存这个空标识,设置个随机的缓存时间即可;布隆过滤器稍微繁琐点。
    crysislinux
        6
    crysislinux  
       2024-11-11 16:47:51 +08:00 via Android
    缓存空数据就好了。应对攻击的话还是用 rate limit 配合日志风控比较好。引入布隆过滤器会创造更多的问题,我个人感觉这东西是不适合做业务的,主要是这种空数据的场景太多了,你不可能给每个地方都搞个布隆过滤器吧。
    Kaiv2
        7
    Kaiv2  
       2024-11-11 16:48:51 +08:00
    不查 db
    chachi
        8
    chachi  
       2024-11-11 16:51:37 +08:00
    缓存空数据只能针对 F5 刷新
    应对攻击还是要请求限制,不然都没用。
    vacuitym
        9
    vacuitym  
       2024-11-11 16:53:25 +08:00
    布隆过滤,好几个项目在用,就是要初始化数据,这个场景还挺适合的
    loveaeen
        10
    loveaeen  
       2024-11-11 16:55:45 +08:00
    存储空数据真有效吗,你的每个标识符我都只请求一次,让你缓存对应的空数据,再继续请求新的标识符,我完全不会命中你的空缓存。
    Chinsung
        11
    Chinsung  
       2024-11-11 17:04:56 +08:00
    缓存空数据,存一个空对象或者特殊值,随机短时间几 s ,削峰就行
    如果恶意请求的话(遍历值空间),就限流+监控告警( ip 维度),直接 banip ,因为限流但是不 banip 的话,正常用户也会被限流
    fkdog
        12
    fkdog  
       2024-11-11 17:08:11 +08:00
    难道不是优先排查缓存命中率低的原因吗?
    是因为恶意遍历刷 id ,还是因为其他页面数据变动没及时更新导致访问失效链接?
    dode
        13
    dode  
       2024-11-11 17:08:15 +08:00
    布隆过滤器 应该可以吧
    或者把所有查询失败的结果,放入布隆过滤器?
    opengps
        14
    opengps  
       2024-11-11 17:11:07 +08:00
    空数想据 是啥?
    happyxhw101
        15
    happyxhw101  
       2024-11-11 17:14:58 +08:00
    布隆过滤器应该只能增加,不能修改、删除吧,另外,布隆过滤器也有一定的误判率,一定不存在,可能存在
    yuanyao
        16
    yuanyao  
    OP
       2024-11-11 17:41:30 +08:00
    @opengps 就比如获取用户设置的安全问题,用户就没设置,安全问题那张表就没数据
    yuanyao
        17
    yuanyao  
    OP
       2024-11-11 17:42:32 +08:00
    @loveaeen 这个不会的,在前面还有 accessstoken 校验的,用户只能查看自己的数据
    zczy999
        18
    zczy999  
       2024-11-11 18:07:53 +08:00
    如果不着急就用复杂的,正好实践一波布隆过滤器
    sazima
        19
    sazima  
       2024-11-11 22:35:07 +08:00
    读到空数据, 往缓存里存一个特殊字符串, 比如__null_value__, 取数据的时候判断一下。
    soap0X
        20
    soap0X  
       2024-11-11 23:33:34 +08:00
    缓存不存在数据 给个特殊标识
    zzmark06
        21
    zzmark06  
       2024-11-13 14:59:08 +08:00
    实际业务,一般是交由风控 ban 了客户 ip
    至于穿透,硬干的多,水文方案没见几个落地的
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2636 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:31 · PVG 17:31 · LAX 01:31 · JFK 04:31
    ♥ Do have faith in what you're doing.