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

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

  •  
  •   yuanyao · 36 天前 · 1678 次点击
    这是一个创建于 36 天前的主题,其中的信息可能已经有所发展或是发生改变。

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