Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

缓存雪崩与缓存穿透的问题 #39

Closed
jiaxingzheng opened this issue Feb 13, 2019 · 1 comment
Closed

缓存雪崩与缓存穿透的问题 #39

jiaxingzheng opened this issue Feb 13, 2019 · 1 comment

Comments

@jiaxingzheng
Copy link

缓存雪崩的问题:

缓存雪崩的事前事中事后的解决方案如下。
事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

redis 重启后从磁盘上加载的数据应该都是过期的数据了吧?和数据库不一致了。

缓存穿透的问题:

举个栗子。数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,请求每次都“视缓存于无物”,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。
解决方式很简单,每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。这样的话,下次便能走缓存了。

感觉这样并没有解决缓存穿透的问题,黑客只需要把每次请求id设置为不一样的负数就可以了

@yanglbme
Copy link
Member

@jiaxingzheng

  • 很多时候,使用缓存的场景不会严格要求一致性。真正发生了雪崩,我们也只是尽快让系统恢复,让其正常提供服务。
  • 关于缓存穿透的问题,其实如果是一些非法的数据请求,我们可以先做过滤的,比如直接拒绝 id 为负数的请求;一些我们没有考虑到的请求,可以采用缓存空值的方式。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants