日常工作中总是会遇到各种bug
很多问题是需要我们未雨绸缪的, 一个程序一定要先做好防护,避免遇到问题了之后加班加点的解决,并且还解决的不是很完美
雪崩、穿透、并发,这些问题是很常见的,很多时候就是因为准备不充分导致的
接下来我会一一介绍这些问题是怎么发生的,然后说一些简单的解决方案
缓存雪崩是指缓存中数据大批量到过期时间或者缓存扛不住压力直接宕机,导致数据请求直接落到数据库中,因为查询数据量巨大,引起数据库压力过大甚至宕机,如下图:
1,redis cluster
我们尽量配置redis cluster缓存集群,这样的话其中一个宕机也不影响缓存的使用,除非出现redis大面积宕机。
redis也要配置持久化,一旦宕机的redis恢复,可以自动从磁盘上加载数据恢复内存中的数据
2,ehcache
可以在请求redis之前再加一层本地ehcache缓存,收到请求后先在ehcache缓存中查询,如果没有再往redis中查询,如果两个缓存都没有再请求数据库
3,hystrix
使用限流组件,我们可以设置接收请求的最大阙值,如果超过就降级。比如,我在程序中设置每秒接收2000个请求,这时一秒进来了5000个请求,那么只有两千请求走进来,剩余3000个请求被降级
这一套操作下来,服务器能扛到的请求数量会大大增高,就算达到阙值也会有限流组件将请求降级,不会出现服务器因为压力过大导致宕机的情况
缓存穿透是指查询一个一定不存在的数据,由于缓存不命中时需要从数据库查询,这将导致这个不存在的数据每次请求都要到数据库中去查询,进而给数据库带来压力,如下图:
1,在查询数据库后,如果查询为空,就在缓存中防止一个N_V 空值,下次再查询同一个key时不走数据库,直接走缓存就可以了
2,开启ip黑名单,如果某个ip频繁非法访问,就加入到ip黑名单中
Redis是单线程的形式运行的,命令先到的先执行,其余的阻塞。所以正常情况下不会出现并发问题,所以一般缓存并发操作不是来自于Redis服务器内部。
缓存的并发问题是多个线程之间没有做好数据同步策略,就会产生类似线程安全的问题
比如:缓存中存储的火车票还剩下 1 张,这时来了两个线程同时拿到了这张火车票卖给了不同的人,这时就会出现火车票超卖的问题。
小伙伴们知道除了加锁,还有哪些方法可以解决缓存并发吗?
点个关注不迷路,小屋带你上高速
是春风, 是余晖, 是一道曙光, 是未来可期。