• QQ怪
    2019-08-29
    学到了很多,挺收益的,思考题:更新效率太低,代价很大,且不一定被访问的频率高,不高则没必要缓存,还不如直接删掉,而且还容易出现数据不一致问题

    作者回复: 👍🏻 对的,两个并发写去更新还存在一致性的问题。不过,在删除缓存后,记得读取数据需要加锁或延时等待,防止读取脏数据。

    
     4
  • AiSmart4J
    2019-08-29
    还有就是更新缓存代价大。如果缓存里的数据不是把数据库里的数据直接存下来,而是需要经过某种复杂的运算,那么这种不必要的更新会带来更大的浪费。

    作者回复: 对的,这也是一种情况

    
     2
  • AiSmart4J
    2019-08-29
    如果是更新数据库再操作缓存的话,此时更新缓存的操作不是必须的。可能缓存里的数据并没有被读到,就会被下一次更新MySQL操作带来Redis更新操作覆盖,那么本次更新操作就是无意义的。
     1
     2
  • yungoo
    2019-08-29
    基于redis集中缓存更新数据采用删除而不是直接更新缓存的原因之一:避免二类更新丢失问题。

    分布式系统中当存在并发数据更新时,因无法保证更新操作顺序的时间一致性,从而导致旧值覆盖新值。

    如:
    t1时间点,A进程发起更新key1为1的P1操作。
    t1+x时间点,B进程发起更新key1为2的P2操作。
    其中P1 -> P2,数据库中值为2。

    而redis收到的指令,可能因网络抖动或者STW,实际为P2 -> P1,缓存的值为1,造成数据不一致。
    展开

    作者回复: 👍🏻 存在并发更新时数据不一致问题

     1
     2
  • godtrue
    2019-09-12
    我觉得看场景,我们是电商的核心系统,计算全部依赖缓存,我们的缓存是经过复杂计算的结构数据,每天定时任务刷新,更新是全部是先添加有效数据后删除无效数据。添加有效数据时,如果数据存在就是更新操作了啦!我觉得挺OK的
    
     1
  • Better me
    2019-08-29
    布隆过滤器为什么要经过n个hash函数散列,有什么特别的考虑吗

    作者回复: 这是为了计算不同的位置,通过不同位置置1,得出一个数值。

    
     1
  • Maxwell
    2019-08-29
    老师您说的:通常我们会在查询数据库时,使用排斥锁来实现有序地请求数据库,减少数据库的并发压力。这个通常哪些方案?

    作者回复: 最常用的就是使用同步锁或Lock锁实现。

     1
     1
  • insist
    2019-12-27
    工作中都有涉及到 但是自己缺乏总结,这篇文章很好
    
    
  • ty_young
    2019-10-31
    老师您好,请问协商缓存和强制缓存没有关联么,不会先走强制缓存,然后在强制缓存的基础上走协商缓存
    
    
  • 绿里奇迹
    2019-10-20
    “当黑客利用大量没有缓存的 key 攻击系统时,缓存的内存会被占满溢出”。但是即使使用bloom filter,这些不存在的key也会被判断为不存在,于是继续在缓存中创建该key,直到缓存被占满请问使用bloom filter为什么能解决这类故意攻击的问题?
     1
    
  • 💢 星星💢
    2019-09-29
    老师,我有个问题,分布式更新或者删除缓存的时候,为啥不对这个操作加锁呢,例如a线程更新或者删除缓存,并更新数据库,然后解锁。此时b线程在争夺锁。并且持有锁。是不是性能问题,所以不这样,还是我理解错了?

    作者回复: 没有理解错,锁和我文中提到的队列都是解决redis缓存数据一致性问题的方案,这种解决方案会带来一定的性能损耗

     2
    
  • Liam
    2019-09-05
    把数据库的数据全部加载到bitmap?

    作者回复: 是的

    
    
  • Liam
    2019-09-05
    bloom filter怎么初始化呢?刚开始bit array都是0吧,不可能直接拒绝掉呀?难道是把数据库的

    作者回复: 初始化时将数据加载到bit array中

    
    
  • Maxwell
    2019-08-30
    老师高并发时会不会卡?影响吞吐量,涉及到要更改公用数据如消费积分总量、每天的消费积分额度,现在没加锁,靠数据库的事务更新,担心以后qps上来了数据库扛不住

    作者回复: 使用队列来异步更新数据,没有压力

    
    
  • victoriest
    2019-08-30
    只看 模块七 值回票价
    
    
  • 疯狂咸鱼
    2019-08-29
    浏览器缓存就是常说的http缓存么?

    作者回复: 对的

    
    
  • 许童童
    2019-08-29
    直接更新缓存中的数据,因为请求到达的顺序无法保证,有可能后请求的数据覆盖前请求的数据。直接将数据删除,就是一种幂等的操作,删除后,再去数据库拉数据,就不会有覆写的问题。

    作者回复: 对的,如果两个并发写去更新还存在一致性的问题,还不如直接删除,等下次读取的时候再次写入缓存中。不过,在删除缓存后,记得读取数据需要加锁或延时等待,防止读取脏数据。

    
    
  • Loubobooo
    2019-08-29
    课后题:原因很简单
    1. 很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据并进行运算,才能计算出缓存最新的值的。
    另外更新缓存的代价有时候是很高的。每次修改数据库的时候,都一定要将其对应的缓存更新一份,这样做的代价较高。如果遇到复杂的缓存数据计算的场景,缓存频繁更新,但这个缓存到底会不会被频繁访问到?如果没有,这个缓存的效率就很低了

    作者回复: 👍🏻 回答很全面

    
    
  • 撒旦的堕落
    2019-08-29
    老师说 缓存数据库一致性问题时 当一个线程缓存删除 而数据库中没有来得及删除时 另一个线程来请求数据 发现缓存中数据不存在去队列中判断 如果数据在更新中 则等待 然后唤醒 不过如果是不同进程中的线程呢 怎么唤醒?感觉这种方式要维护的数据更多了 要把删除的缓存取出来放到队列中 然后更新完成后 还要删除队列中的数据 为了应对分布式的情况 还要使用的是分布式队列 效率变低了 有木有更好的办法呢

    作者回复: 暂时没有想到更好的

    
    
  • -W.LI-
    2019-08-29
    老师真棒,全能。
    CDN的缓存策略是copy服务端的,协商缓存和强缓存?如果有些静态资源,服务端开发没做缓存策略,CDN还会缓存么?实际开发中用过一次CDN。是在资源路径前,拼接一段CDN路径。具体不知
    课后习题,如果并发操作时,虽然redis是单线程的但是没法保证网络延时下,先更新数据库。也先更新缓存。个人感觉失效一个key比写一个key开销小。网络传输上看,update还得传一个value的值,redis更新还得写缓存感觉也是失效慢。并发情况写两次(除开正确性)有一次的写完全浪费。

    作者回复: 通常我们是会指定一些静态资源文件上传到CDN上去,并且通过版本号来更新。例如,我们的js资源文件是 xxx001.js,如果我们更新了该资源文件,则将xxx002.js推送到CDN上,同时前端的访问路径也更新访问资源路径。

    
    
我们在线,来聊聊吧