一、缓存处理流程
前台要求,后台首先从缓存中提取数据,然后直接返回结果。 如果不能提取,则从数据库中提取,数据库在更新缓存中提取,并返回结果。 如果数据库也没取,它就直接返回空结果。
二、缓存穿透
描述:
缓存直通是指既不在缓存中也不在数据库中的数据,用户不断请求id为“- 1”的数据、id特别大且不存在的数据等。 此时的用户很可能是攻击者,攻击会增加数据库的压力。
解决方案:
接口层增加检查,如用户认证检查,id进行基础检查,id=0的直接监听; 无法从缓存中检索的数据也无法从数据库中检索。 在这种情况下,也可以将key-value对写为key-null。 缓存的有效时间可以设置为较短的值,例如30秒。 这样可以防止攻击用户用同一id反复暴力攻击
三、缓存击穿
描述:
高速缓存击穿是指不在高速缓存中但在数据库中的数据(通常是高速缓存时间已过期),同时使用者非常多,即使同时读取高速缓存也无法读取数据,而且同时将数据检索到数据库中,因此
解决方案:
热点数据的设置永远没有期限。 添加互斥锁。 互斥锁的引用代码如下:
说明:
1 )缓存中有数据,按上述代码13行进行操作,即可返回结果
2 )缓存中没有数据。 第一个进入的线程获取锁定并从数据库中检索数据。 在未解除锁定之前,其他并行进入的线程等待100ms,然后再去取数据。 这样可以避免到所有数据库重复检索数据,并在缓存中重复更新数据。
3 )这当然是简化处理的,理论上如果可以根据key值进行锁定就更好了,但线程a从数据库中提取key1的数据并不妨碍线程b提取key2的数据。 上面的代码显然做不到这一点。
四、缓存雪崩
描述:
缓存平衡是指缓存中的数据大量过期,但查询数据量巨大,数据库压力过大,甚至成为down机器。 与缓存击穿不同,缓存击穿是指同时检查与缓存击穿相同的数据。 高速缓存细化是指不同的数据已过期,无法查询大量数据而查询数据库。
解决方案
缓存数据的过期时间是随机设置的,以确保在同一时间大量数据不会过期。 如果缓存数据库是分布式的,则热点数据均匀分布在不同的缓存数据库中。 热点数据的设置永远没有期限。