一、缓存击穿
二、缓存穿透
三、缓存雪崩
很多时候,Redis中的缓存是要设置过期时间的,假如Redis中的数据,过期时间都设置成一样的,那么到了时间之后,全部缓存过期失效,下一秒所有的请求都会访问数据库,那么数据库可能因为访问量过大导致“崩溃”,这就是缓存雪崩。
如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。
这个没有完美解决办法,但可以分析用户行为,尽量让失效时间点均匀分布。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。
应对方法:
1、缓存永远不过期:最暴力的解决办法,缓存不设置自动过期时间,只要缓存不崩,数据库就不会崩。
2、使用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。
加锁排队. 限流-- 限流算法. 1.计数 2.滑动窗口 3. 令牌桶Token Bucket 4.漏桶 leaky bucket [1]。
在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
3、做二级缓存,或者双缓存策略。
A为原始缓存,B为拷贝缓存。A失效时,可以访问B,缓存A的失效时间为20分钟,缓存B不设置失效时间。自己做缓存预热操作。细分以下几个小点:
- 从缓存A读数据库,有则直接返回。
- 若缓存A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。
- 更新线程同时更新缓存A和缓存B。
4、给缓存的失效时间,加上一个随机值,避免集体失效。让缓存过期时间不那么一致,比如一批缓存数据24小时后过期,那么就在这个基础上,每条缓存的过期时间前后随机1-6000秒(1-10分钟)。设置不同的过期时间,让缓存失效的时间点尽量均匀。
Redis—缓存击穿、缓存穿透、缓存雪崩平板电脑pc数据解读、 高级管理、 灰色清关、 意大利VAT注册流程以及需要的资料、 亚马逊在英国开放Amazon Shipping服务 、 各种邮件模板合集、 除了Facebook和Google,这些广告营销网站也值得关注、 深度解读:海关总署跨境电商194号文件、
No comments:
Post a Comment