结合我们通常的业务场景来分析下redis的几个缓存的问题。
我们是如何使用redis来做分布式缓存
不喜欢多说,直接上图
缓存穿透、缓存击穿、缓存雪崩区别和解决方案
我比较喜欢表格的方式来表达区别,比较一目了然,请看
类别/区别 | 问题描述 | 数据 | 场景举例 | 解决方案 |
---|---|---|---|---|
缓存穿透 | 缓存穿透是指redis缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为数据库不存在的数据。这时的用户请求很可能是攻击请求,导致数据库压力过大。 | 1、缓存没有 2、数据库没有 3、多为恶意请求 | 栗子来一个,一个爬虫不停的通过特定接口http://example_url?param=value来爬取我们系统的数据可能它不知道我们的具体的value是多少,所以只能暴力的通过轮询大量未知的value来请求我们的接口 | 接口层增加校验,对于明显不合法的参数进行拦截,例如 id做校验,id<0的直接拦截;从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击 |
缓存击穿 | 缓存击穿是指缓存中没有而数据库中有的数据, 这可能是缓存时间到期,这时如果并发用户特别多, 同时读缓存没读到数据,又同时去数据库去取数据, 引起数据库压力瞬间增大 | 1、缓存没有2、数据有3、并发量大 4、针对一条数据 | 举起一个栗子,早年12306刚上线,我们春节抢票,假如开票时间是早上8点,上亿的人摩拳擦掌,8点一到我们期待的7300次绿皮车上架了,键盘侠们一顿狂点,这时候缓存还没数据,一下子都去查数据库了 | 1、预加载数据到内存 2、对于加载数据到内存的操作加锁 |
缓存雪崩 | 缓存雪崩是指缓存中数据大批量超时失效, 这时候如果查询数据量巨大,会导致数据库压力 瞬间增大甚至宕机崩溃。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据 都过期了,很多数据都查不到从而查数据库。 | 1、缓存没有2、数据库有 3、并发量大 4、只对大批量的数据 | 同栗子二,大量地区的大量车次 | 1、随机设置缓存数据的到期时间 2、预加载数据 3、缓存分布式部署,将数据均匀分布在不同缓存中 4、设置热点数据永远不过期或者过期时间尽量为闲时。 |