首页 > 编程知识 正文

缓存击穿和缓存雪崩,缓存穿透的解决方案

时间:2023-05-05 23:36:01 阅读:29679 作者:3266

一、缓存处理流程

前台要求,后台首先从缓存中提取数据,然后直接返回结果。 如果不能提取,则从数据库中提取,数据库在更新缓存中提取,并返回结果。 如果数据库也没取,它就直接返回空结果。

二、缓存穿透

描述:

缓存直通是指既不在缓存中也不在数据库中的数据,用户不断请求id为“- 1”的数据、id特别大且不存在的数据等。 此时的用户很可能是攻击者,攻击会增加数据库的压力。

解决方案:

接口层增加检查,如用户认证检查,id进行基础检查,id=0的直接监听; 无法从缓存中检索的数据也无法从数据库中检索。 在这种情况下,也可以将key-value对写为key-null。 缓存的有效时间可以设置为较短的值,例如30秒。 这样可以防止攻击用户用同一id反复暴力攻击

三、缓存击穿

描述:

高速缓存击穿是指不在高速缓存中但在数据库中的数据(通常是高速缓存时间已过期),同时使用者非常多,即使同时读取高速缓存也无法读取数据,而且同时将数据检索到数据库中,因此

解决方案:

热点数据的设置永远没有期限。 添加互斥锁。 互斥锁的引用代码如下:

说明:

1 )缓存中有数据,按上述代码13行进行操作,即可返回结果

2 )缓存中没有数据。 第一个进入的线程获取锁定并从数据库中检索数据。 在未解除锁定之前,其他并行进入的线程等待100ms,然后再去取数据。 这样可以避免到所有数据库重复检索数据,并在缓存中重复更新数据。

3 )这当然是简化处理的,理论上如果可以根据key值进行锁定就更好了,但线程a从数据库中提取key1的数据并不妨碍线程b提取key2的数据。 上面的代码显然做不到这一点。

四、缓存雪崩

描述:

缓存平衡是指缓存中的数据大量过期,但查询数据量巨大,数据库压力过大,甚至成为down机器。 与缓存击穿不同,缓存击穿是指同时检查与缓存击穿相同的数据。 高速缓存细化是指不同的数据已过期,无法查询大量数据而查询数据库。

解决方案

缓存数据的过期时间是随机设置的,以确保在同一时间大量数据不会过期。 如果缓存数据库是分布式的,则热点数据均匀分布在不同的缓存数据库中。 热点数据的设置永远没有期限。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。